um simples pequeno “cd” não funciona no script [duplicado]

1
#!/bin/bash
#
echo $PWD
cd /home/<my username>/<long path>
echo $PWD

O que eu recebo ao executá-lo com bash script.sh :

/home/<my username>
: No such file or directorye/<my username>/<long path>
/home/<my username>

Ou com bash . script.sh

.: .: is a directory

Parece que, no primeiro caso, ele simplesmente pulou os primeiros 4 caracteres ( /hom ) da linha de endereço sem nenhum motivo. E no segundo caso, o que diabos é .: .: ? É absolutamente "desagradável".

E ofc quando eu copiopastar esta linha cd /home/<my username>/<long path> no terminal funciona como deveria.

EDIT: FOI TUDO SOBRE UM SÍMBOLO DE ESPAÇO AUSENTE NO FINAL DO CAMINHO, OBRIGADO.

    
por Sigmund Freud 28.12.2016 / 17:01

3 respostas

3

Você deve

  • verifique o script em busca de qualquer "caractere oculto" antes da parte "/ home" (isso explicaria que ele não pode ser copiado para ele, e por que a exibição trunca parte dela também). Por exemplo: cat -ve THEFILE # -e marcará cada extremidade da linha com um $ e -v mostrará alguns dos caracteres de controle no formato ^x , ex: ^M para o caractere de controle "Retorno de carro".

  • Corrigir: Para isso, digite um exemplo de trabalho em seu shell, copie-o usando o mouse, edite o script, exclua a linha e cole o que você copiou em seu lugar. (no vi: se o script é exatamente como descrito (e a linha defeituosa é a linha 4): você vai para a linha 4 com 4G e, em seguida, exclui essa linha com dd , e entre no modo Insert na linha acima com: O (capital o). Então você pode colar as linhas que copiou com o mouse, então Escape para voltar ao modo de comando, e :wq para gravar as alterações no arquivo e sair do vi.

  • Você pode comparar a saída $ (pwd) com o valor $ PWD: tente substituir: echo $PWD por: pwd ; echo "PWD=$PWD"

  • finalmente: bash . script.sh deve ser: bash ./script.sh . O que você digitou pede bash para executar "." com o argumento "script.sh" e "." sendo um diretório, o bash reclama. Quando invocada dessa maneira, a reclamação geralmente está no formato: program_name: some message . Aqui o bash tenta executar o programa . , então sua mensagem de erro usa erroneamente .: como o prompt do nome do programa, e a mensagem que ele exibe é .: is a directory , indicando que não pôde executá-lo e por quê (é um diretório, não um script bash).

  • Observe que, quando você invode script.sh dessa maneira (bash ./script.sh), você solicita ao seu shell atual para invocar um subwell bash que executará script.sh e sairá. Apenas esse subshell bash será: ecoando o PWD, em seguida, cd-indo para o diretório, o eco do novo PWD. Quando esse bash sai, seu shell atual ainda está no diretório original. Se você quiser que um arquivo faça alterações no seu shell atual, coloque-o em seu lugar: . ./script.sh ou no bash você também pode source ./script.sh (nota: . é a maneira mais portátil de criar um arquivo) (nota 2: ter um caminho para o arquivo é recomendado no shell recente, ou seja: . script.sh pode funcionar também, mas é recomendado especificar o caminho local como: . ./script.sh )

por 28.12.2016 / 17:10
1

Sua segunda pergunta é fácil:

.: .: is a directory

Quando você está executando um script Bash e o Bash encontra um erro, ele imprime o nome do script e a linha em que o erro foi encontrado, assim:

script.sh: line X: some message

A linha de comando bash . something.sh tenta executar . como um script e, portanto, falha. Talvez você estivesse procurando por bash ./script.sh ? Nesse caso, você não precisa especificar o caminho completo. Bash pode encontrar o script se você só fizer bash script.sh .

A saída do seu script é meio estranha:

: No such file or directorye/<my username>/<long path>

Faltam as informações do arquivo e parte da mensagem de erro.

Suponho que o seu script tenha alguns caracteres não imprimíveis não intencionais. Se isso foi escrito com um editor que usa terminadores de linha CR-LF, você pode importá-lo com fromdos -b script.sh . O -b sinalizador garante que fromdos deixará um backup do seu arquivo original. Se você está no Debian, você pode instalar este programa com o pacote tofrodos .

Para verificar se você possui caracteres não imprimíveis não intencionais, use cat -A . Diversas coisas interessantes podem aparecer. Por exemplo, os TABs imprimirão como ^I e novas linhas como $ . Se o seu arquivo tiver feeds de linha estilo MS-DOS, eles aparecerão como ^M$ .

    
por 28.12.2016 / 18:14
0

Você pode fazer o seguinte comando e executá-lo novamente?

dos2unix script.sh

Se ainda não estiver funcionando, remova as letras não imprimíveis do arquivo usando o comando abaixo

tr -cd "[:print:]" script.sh > script2.sh bash script2.sh

    
por 28.12.2016 / 18:42