Executando um script em permissões zsh - file

14

Estou confuso sobre a execução de permissões de arquivos que não se comportam como eu esperava. Provavelmente porque minhas expectativas estão erradas. De qualquer forma:

Eu tenho um arquivo de script, pois a simplicidade é chamada apenas de s , localizada em ~/bin . Por causa deste exemplo, o arquivo contém apenas as seguintes linhas:

#!/bin/zsh
echo "Test";

Muito simples.

Eu navegue até o diretório ~/bin e chmod das permissões de arquivo de s para 400 , ou seja, somente leitura somente para mim. Nenhuma permissão de execução. Então, eu tento executar o script inserindo seu caminho, dando isto:

% ./s
zsh: permission denied: ./s

Até aí tudo bem. O arquivo não pode ser executado devido às permissões erradas. Permissões de até 500 (permissão de execução concedida) também funcionam bem - com essas permissões, o arquivo é executado corretamente:

% ./s
Test

Isso é tudo como esperado. Mas então eu chmod permissões de volta para 400 (perco a permissão novamente), tente source ing o arquivo, e isso acontece:

% source s
Test

Embora as permissões sejam 400 , o script é executado.

Então aqui está a minha pergunta: por que ./s falha (como deveria), mas source s é executado normalmente? Isso não prejudica todo o propósito da permissão de execução?

Em 400 permissions, sh s e zsh s também funcionam.

Tenho certeza de que estou fazendo ou entendendo algo terrivelmente errado em algum lugar. Alguém pode me mostrar onde e explicar a diferença entre ./s , source s , sh s e zsh s ?

    
por C106 31.08.2012 / 03:39

1 resposta

16

Quando você executa ./s , você diz ao kernel para executar o programa s . Se você tem permissão de execução, o kernel lê os primeiros bytes do arquivo, vê a linha #! para saber que é um script e executa o interpretador, passando o nome do script como primeiro argumento. Se você não tem permissão de execução, o kernel aborta a execução na primeira etapa.

Quando você executar zsh s , você executará zsh e instruirá para ler o arquivo chamado s e interpretá-lo como comandos. Você não está executando s , está executando zsh . Mesma coisa com sh s ou cat s .

Quando você executa source s , novamente, você diz ao zsh para ler um arquivo, então o que importa é que você tenha permissão de leitura nele.

    
por 31.08.2012 / 03:49