Qual é a diferença entre 'test' e 'test.sh' durante a execução de scripts de shell?

1

Eu adicionei uma pasta ./bin/ no meu diretório pessoal.

E eu coloquei dois arquivos na pasta ./bin , um com apenas um nome de arquivo e o outro é um nome de arquivo.ext.

Os nomes dos arquivos são test e test.sh :

Quando eu corro com apenas o nome do arquivo, o terminal não mostra nenhuma saída, mas quando eu tentei com o test.sh, o script foi executado:

Minha pergunta é, posso executar o script apenas usando o nome do arquivo, como "teste" no terminal, em vez de dar o "test.sh".

    
por Naga Venkatesh Gavini 28.10.2017 / 16:37

1 resposta

3

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.

    
por Sergiy Kolodyazhnyy 28.10.2017 / 17:32