Como o shell executa comandos:
Do manual do bash:
Se o nome não for nem uma função do shell nem um builtin e não contiver barras, o bash pesquisará cada elemento do PATH em um diretório que contenha um arquivo executável com esse nome.
Isso significa que as funções e os comandos internos do shell têm precedência primeiro, e se não houver nenhum - ele procura o comando na lista de diretórios especificados em PATH
variable.
Por que meu comando "teste" não funcionou?
O que você encontrou é o comando test
, que é um comando interno compatível com o shell Bourne original em bash
. Esse comando é silencioso e é usado para lógica simples, avaliação aritmética e avaliação de string. É usado na lógica e nas instruções if:
bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2
Observe que test
e [
são exatamente iguais:
bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2
Há também /usr/bin/test
, que está entre os utilitários padrão, e existe para portabilidade e compatibilidade. Se não houvesse test
embutido no seu shell, ele procuraria a variável PATH
e, se /usr/bin/
estivesse antes de seu ~/bin
na lista, ele executaria /usr/bin/test
. Aqui está um exemplo disso:
bash-4.3$ enable -n test
bash-4.3$ PATH="$HOME/bin/:$PATH" test
I am ~/bin/test
Usando o comando enable -n
, desativamos o test
integrado e executamos o test
temporariamente com o PATH
assim modificado, meu ~/bin
é o primeiro da lista. O shell examina a lista e localiza meu script de shell ~/bin/test
e o executa.
OBSERVAÇÃO: por favor, não faça isso! O exemplo acima é apenas para demonstração! Esta não é uma boa maneira de executar seus scripts e não é recomendada. Use a nomenclatura apropriada, nunca nomeie seus comandos como integrações de shell ou utilitários existentes. Você foi avisado.
Por que o trabalho do test.sh?
O que aconteceu no seu caso test.sh
é que não há funções integradas ou chamadas test.sh
e, portanto, o shell pesquisou todos os diretórios em PATH
list até encontrar o arquivo test.sh
e executá-lo. É por isso que funciona.
Esse comportamento está relacionado a extensões de arquivo?
Não. Isso não tem nada a ver com extensões de arquivos e, de fato, a maioria dos arquivos é irrelevante. O Shell cuida da localização do que você digita no prompt de comando, se é um built-in ou função ou alias, e se o arquivo que você mencionou tem permissões executáveis definidas.
Além disso, ele se preocupa com a linha #!
apropriada (que é mais formalmente conhecida como diretiva de intérprete ), porque se você tem um shell script escrito para C-shell, mas ele não tem a linha #!
apropriada no topo, e você tenta executá-lo com bash
- o shell tentará executá-lo, mas ele irá quebrar devido a incompatibilidade sintaxe.
Mais geralmente, os sistemas Linux e Unix-like se preocupam principalmente com números mágicos que são os primeiros bytes em um arquivo que identifica o tipo de arquivo.