Questão Por que preciso definir permissões de execução para executar um script bash quando ele pode ser executado se eu forçar com “bash test.sh?”


Estes são os conteúdos de test.sh:

#!/bin/bash
echo "test me"

Para executar com bash test.sh,sem problemas. Mas para executar com ./test.sh, um erro ocorre:

bash: ./test.sh: Permission denied

chmod u+x test.sh pode fazê-lo funcionar com ./test.sh.

Eu quero saber o motivo: por que não é necessário adicionar chmod u+x test.sh quando executá-lo com bash test.sh?

E por que é necessário adicionar chmod u+x test.sh quando executá-lo com ./test.sh?


0


origem


Duplicação possível de Como executar um script bash? - JakeGould
Enquanto "por que" perguntas PODEM ser sujeitas a opinião, neste caso, esta pergunta tem uma resposta clara (veja a resposta marcada). Além disso, a duplicata marcada é uma questão de "como" e, portanto, qualitativamente diferente dessa questão. Não é uma duplicata. - music2myear


Respostas:


Quando você o executa com bash test.sh você está dizendo explicitamente bash para carregar e executar test.sh. O arquivo só precisa ser lido para "correr" por esse método. Mas se você acabou de executar um arquivo com ./test.sh assim, ele não será executado porque o arquivo não tem permissões de execução explícitas; acabou de ler permissons.

Significado, no primeiro caso test.sh está sendo carregado por bash. Mas por si só, os sistemas Unix / Linux não executam arquivos por padrão. E depois disso, se você remover essa inicial #!/bin/bash a partir de ./test.sh e tente executá-lo mesmo com permissões de execução, ele não será executado, pois o sistema não saberá o que fazer com os comandos abaixo dele.

E se você está se perguntando enquanto os arquivos não recebem permissões de execução automaticamente na criação? Bem, essa é uma longa conversa, mas basicamente fazer algo assim criaria uma nova superfície de ataque no seu sistema. Se alguém pode entrar no seu sistema e apenas executar arquivos escrevendo-os, isso é um problema muito grande.


1





Ao contrário dos sistemas operacionais inspirados em CP / M, como DOS e Windows, o Unix não usa nomes de arquivos para indicar quais arquivos são executáveis.

Se você quiser executar um arquivo usando a chamada do SO 'execvpe ()'ou nomeando-o na linha de comando, ele precisa ter permissão de execução

Desde que tenha o bit de execução definido, chame-o como quiser, por exemplo: trump.gif  ou foo-script (mas test não é um bom exemplo, pois já existe um comando com esse nome)


1



Sim, o arquivo NÃO deve ser chamado de "teste", já que é um nome de comando. - ArchonOSX