A diferença entre o fornecimento ( . test.sh
) do script e sua execução ( test.sh
ou ./test.sh
) está na primeira linha.
Se você adquirir o script, a primeira linha será apenas um comentário e será ignorada. Mas se você executá-lo, a primeira linha é examinada pelo kernel para os dois primeiros caracteres, e se eles forem " #!
", o resto da linha será usado como o caminho e o primeiro argumento para um interpretador. O kernel procurará um executável chamado /bin/bash
e passará o nome do script como primeiro argumento. Assim: /bin/bash ./test.sh
.
Isto é o que normalmente aconteceria e você está certo, deveria ter o mesmo efeito para o seu roteiro. Mas o seu script contém um problema: A primeira linha termina com um final de linha do DOS (CR LF) em vez de um final de linha unix (LF). Portanto, o nome do interpretador, como o kernel vê, é /bin/bash^M
, o qual não existe no seu disco (^ M significa CR falso antes do final da linha). Para piorar, o caractere ^ M é geralmente invisível.
Você pode provar que este é o caso de cat -v test.sh
(que imprime a substituição ^ M para o caractere CR invisível).