Seu script começa com:
#!/bin/sh
Este não é um comentário, mas um shebang para dizer ao seu sistema operacional para usar /bin/sh
para execute o script. Mas aparentemente o Ubuntu não consegue encontrá-lo.
-
Se
ls /bin/sh
não mostrar resultado, então acho que isso precisa ser corrigido. Como uma solução temporária, você pode ter sorte que seu script também funcione, por exemplo, bash:#!/bin/bash
-
Se
/bin/sh
existir (como deveria), então o Ubuntu não consegue interpretar essa primeira linha. Despeje-o como hexadecimal:head -n 1 myscript.sh | hexdump -C 00000000 ef bb bf 23 21 2f 62 69 6e 2f 73 68 0d 0a |...#!/bin/sh..|
E com o resultado:
-
Certifique-se de que os finais de linha estão usando o formato Unix, LF (
\n
ou hexadecimal0a
) em vez de, por exemplo, o padrão CRLF do Windows (\r\n
ou hexadecimal0d0a
no exemplo acima). Em um Mac, isso causaria um erro diferente:/bin/sh^M: bad interpreter: No such file or directory
-
Certifique-se de que as codificações de arquivos não estraguem, como uma lista de materiais (Unicode) (invisível) do Unicode (
ef bb bf
no exemplo de saída acima). No exemplo acima, seu shell não está vendo um comentário ou o shebang, mas está tentando executar um comando que começa com 3 caracteres invisíveis. Nesse caso, seu shell provavelmente ainda executaria as próximas linhas ou poderia até mesmo concluir o script com êxito. Em um Mac, a primeira linha realmente é lançada:./myscript.sh: line 1: #!/bin/sh: No such file or directory
-
Para despejar a mensagem de erro para ver os caracteres invisíveis nessa mensagem, é necessário redirecionar a saída de erro para a saída padrão:
./myscript.sh 2>&1 | hexdump -C
00000000 2e 2f 6d 79 73 63 72 69 70 74 2e 73 68 3a 20 6c |./myscript.sh: l|
00000010 69 6e 65 20 31 3a 20 ef bb bf 23 21 2f 62 69 6e |ine 1: ...#!/bin|
00000020 2f 73 68 3a 20 4e 6f 20 73 75 63 68 20 66 69 6c |/sh: No such fil|
00000030 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 0a |e or directory.|