Obrigado por toda a entrada. Vou tentar responder minha própria pergunta agora e fornecer um guia completo para as diferentes possibilidades de executar scripts e binários. Edite e comente e poderemos criar algo que esteja completo e correto. Aqui está a minha sugestão:
A princípio, dois pontos a serem declarados:
O Linux faz uma distinção entre um comando e um caminho . Um comando é digitado apenas como está no prompt e executará um built-in ou fará com que o Linux procure por um binário ou um script correspondente no $ PATH.
Para o Linux interpretar algo como um caminho, ele precisa conter pelo menos uma barra (/). Por exemplo ./myScript
, em , ./
pode parecer bastante redundante - existe apenas para fazer o Linux interpretá-lo como um caminho e não como um comando.
Portanto, as opções para executar um binário ou um script:
Executando um binário binary
:
$ binary # when 'binary' is on the PATH, or is a built-in
$ ./binary # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir
Executando um script script
:
O arquivo precisará ter permissões de execução, a menos que seja especificado o contrário.
$ script # execute a script that is on PATH. Will be executed in a new shell.
# The interpreter to use is determined by the she-bang in the file.
$ ./script # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir.
# Otherwise as above.
$ . script # execute a script in the current dir. Will be executed in the
# current shell environment.
$ source script # equivalent to the above *1
$ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...',
# 'zsh ...' etc.). Execute permission not neccessary.
Sobre she-bangs :
Os scripts com um she-bang (por exemplo #!/bin/sh
) na primeira linha informam qual intérprete usar.
- Este intérprete será usado quando executado por
./script
ou usando um comando: script
( script
deve estar no PATH)
- Usar
sh script
ignorará o she-bang e usará, neste caso, sh
como intérprete
- Usando
. script
ou source
vai ignorar a ela-bang e usar o interpretador atual (desde .
ou source
é equivalente a apenas a execução de cada linha do script no shell atual)
Notas de rodapé
* 1: Isso é quase verdade. No bash, eles são realmente o mesmo comando, mas, quando usado source
, script
será pesquisado em $ PATH antes do diretório atual. Isso é básico, mas em shells somente POSIX, source
não funciona, mas .
funciona. Então, use o último para portabilidade.
* 2: o que realmente acontece é que executamos o sh binário com 'script' como argumento, o que fará com que 'sh' execute 'script' em seu novo shell