Você tem caracteres CR (^ M) no seu script. Converta-o para ter Unix end-of-lines (somente LF). De um modo portátil:
tr -d '\r' < your_script > output_script
Algumas explicações baseadas no comentário de Olivier Dulac sobre o que aconteceu com os caracteres CR: Primeiro, na linguagem shell, o caractere CR não é considerado como um caractere especial, por ex. não é considerado como um espaço e não é ignorado. Eu escrevo como ^M
abaixo.
-
Na linha
echo $HOME^M
, o conteúdo de$HOME
seguido por^M
seguido por uma nova linha foi produzido. Saída do caractere CR colocar o cursor na primeira coluna, mas desde que foi imediatamente seguido por uma nova linha, isso não teve efeito visível. -
Na linha
cd $HOME^M
, como não há espaço entre$HOME
e o caractere CR, eles estão no mesmo argumento$HOME^M
e esse diretório não existe. Na mensagem de erro, o caractere CR após$HOME
era apenas a saída, colocando o cursor na primeira coluna, para que o início da linha fosse substituído pelo restante da mensagem, se houver: ": Nenhum arquivo ou diretório desse tipo" com bash (seu primeiro exemplo), nada com traço (seu segundo exemplosh script.sh
, como#!/bin/bash
foi ignorado desde que você pediu explicitamente para executar o script comsh
, o que parece ser traço no seu caso). A mensagem de erro depende completamente do shell. Por exemplo, o zsh detecta que o caractere CR não é imprimível e gera uma mensagem como:cd: nenhum arquivo ou diretório: / usr / local / src / ^ M
(com os caracteres "^" e "M", não o caractere CR), o que permite detectar a causa do problema com muito mais facilidade. Caso contrário, você precisará redirecionar / canalizar stderr para algum utilitário que mostre caracteres especiais, como cat -ve
, conforme sugerido por Olivier, ou para hd
, que fornece a sequência de bytes do fluxo.