“Não é possível fazer o cd para / home / user” ao pesquisar um script [duplicado]

5

Eu tenho este script:

echo $HOME
cd $HOME
cd /
cd /usr/local/src/

Quando eu executo assim

. script.sh

Eu recebo esta saída:

/home/user
: No such file or directory
: No such file or directory
: No such file or directory

Se eu executar normalmente (adicionei #!/bin/bash antes da primeira linha)

sh script.sh

Eu recebo esta saída:

: not found.sh: 2: script.sh
/home/user
script.sh: 3: Can't cd to /home/user
script.sh: 4: Can't cd to /
script.sh: 5: Can't cd to /usr/local/src/

O script foi executado a partir do diretório $HOME a cada vez. Se eu executar cada comando um por um do shell, ele será executado sem problemas (chamar cd $HOME de $HOME simplesmente não alterou o diretório).

O que devo fazer para que isso funcione?

    
por Karlovsky120 08.09.2014 / 17:55

4 respostas

14

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 exemplo sh script.sh , como #!/bin/bash foi ignorado desde que você pediu explicitamente para executar o script com sh , 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.

    
por 08.09.2014 / 18:11
4

Se você usar set -x , perceberá porque a origem do arquivo está falhando:

$ . test.sh
+ . test.sh
++ echo $'/home/braiam\r'
/home/braiam
++ cd $'/home/braiam\r'
: No such file or directory
++ cd $'/\r'
: No such file or directory
++ cd $'/usr/local/src/\r'
: No such file or directory

Como vinc17 disse, apenas remova a parte \r do seu script e você ficará bem. Você pode usar a sua solução ou usar dos2unix script.sh , também sed -i 's/\r//' script.sh

    
por 08.09.2014 / 18:27
1

Você também pode usar o comando abaixo para remover os caracteres CR.

perl -p -i -e "s/\r//g" script.sh

Se você estiver usando vi / vim , você pode fazer,

:set ff=unix
    
por 08.09.2014 / 18:53
1

Eu tive esse mesmo problema e corrigi-lo convertendo os caracteres EOL para o formato UNIX. Uma maneira fácil de fazer isso é:

  • Carregue o arquivo no Notepad ++
  • Selecione todo o texto a ser convertido (Ctrl + A)
  • Editar > Conversão EOL > UNIX
  • Salve o arquivo

Se já estiver no formato UNIX, selecione outro formato (Windows) e, em seguida, volte para o UNIX

    
por 08.04.2015 / 19:30