Executando o script bash executável com barra ou sem

2

Eu tenho o script bash test.sh , que não faz nada de especial:

#!/bin/bash
echo Hello!

Se eu executo assim . test.sh , funciona.

kopparberg:dev marek$ . test.sh
Hello!

Se eu executo assim ./test.sh , isso não acontece.

kopparberg:dev marek$ ./test.sh 
-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

Qual é a diferença?

    
por Marek 01.12.2012 / 18:56

2 respostas

5

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).

    
por 01.12.2012 / 19:31
2

A primeira solução é um apelido para o comando "source".

O shebang é considerado como um #comentário para a fonte

Quando você chamar o script com ./script , o shell executará o script com o shebang #!/bin/bash

O erro que você deu parece ser um problema CRLF, você pode executar:

dos2unix script.sh

para remover as linhas finais do Windows.

    
por 01.12.2012 / 19:02

Tags