Como @graeme apontou astutamente desde que você tem o script em ambos os formulários no servidor, você pode executar um simples diff
para determinar o que é diferente entre a versão de trabalho e a versão problemática.
$ diff working.sh broken.sh
Você também pode fazer um diff lado a lado assim:
$ diff -y working.sh broken.sh
Se o script não estiver funcionando devido a algum tipo de erro de digitação, muitas vezes você poderá detectá-los adicionando a opção -x
a bash
, o que faz com que seja detalhado.
$ bash -x broken.sh
Você também pode incorporar essa opção no shebang ( #!/bin/bash
) na parte superior de seus scripts da seguinte forma:
#!/bin/bash -x
Endings de linha
Este é frequentemente o problema ao mover arquivos do Windows para sistemas Unix / Linux. A questão tem a ver com como as extremidades das linhas são indicadas nas duas plataformas. Você pode ler mais sobre isso aqui na Wikipedia, intitulado: Newlines .
faça um arquivo de exemplo
$ echo -e "This is a file.\nThat I made on Unix.\n" > unixfile.txt
Como @terdon descreveu em sua resposta, você pode usar sed
para removê-los, você também pode usar uma ferramenta chamada dos2unix
para fazer a mesma coisa também. Você pode usá-lo de duas maneiras:
$ dos2unix unixfile.txt
ou se você não quiser sobrescrever o arquivo existente:
$ dos2unix -n oldfile.txt newfile.txt
Quando você usa o diff
acima que mencionei anteriormente, você obterá uma saída assim quando comparar esses dois arquivos:
$ diff -y unixfile.txt winfile.txt
This is a couple | This is a couple
of lines of sample | of lines of sample
text. | text.
Você não será capaz de discernir as diferenças, apenas que elas estão lá. Novamente, a resposta de @ terdon mostra um método para encaminhar o problema usando od
. É claro que você pode usar várias maneiras de descobrir o que está acontecendo.
Usando o vim
com o file
cmd.
$ file unixfile.txt
winfile.txt: ASCII text
$ file winfile.txt
unixfile.txt: ASCII text, with CRLF line terminators
O texto acima está destacando o problema, que o arquivo do Windows tem caracteres CRLF (também conhecidos como Carriage Return + Linefeed no final das linhas). Esses caracteres são 0x0D & 0x0A em hexadecimal, veja novamente o artigo da Wikipédia sobre Newlines se você quiser saber mais sobre isso.
Você também pode usar vim
para ver o problema também:
$ vim winfile.txt
Aqui está uma pequena sequência que mostra o que fazer em vim
para ver o problema. Os caracteres CRLF normalmente aparecem no Unix como ^M
, que é um Ctrl + M .
A sequência está me mostrando a reabertura do arquivo, winfile.txt
como um arquivo Unix formatado ( :e ++ff=unix
). Isso diz a vim
para não detectar automaticamente que o arquivo está formatado para o Windows e, portanto, exibirá os caracteres de término de linha ^M
.