Por que o nome do arquivo contém pontos de interrogação quando executo um script na minha máquina remota?

10

Eu tenho um pequeno script que simplesmente busca a data atual, executa um script PHP e redireciona a saída (e erros) para um nome de arquivo que contém a data atual.

DATE=$(date +"%Y%m%d")
FILE="log/${DATE}.log"
php -q script.php >> $FILE 2>&1

Quando executo esse script na minha máquina local (Windows 7, Aptana IDE), o script PHP funciona bem e o arquivo de log tem o nome de arquivo esperado, por exemplo 20140502.log.

Mas quando eu envio esse script via SFTP para minha máquina remota e executo esse script, o nome do arquivo fica assim:

20140502?.log?

Qual pode ser o problema? Isso é um erro de ligação (por exemplo, a codificação para uploads de SFTP é ANSII, onde UTF-8 é esperado)? Ou tenho que mudar alguma coisa no próprio script?

Informações sobre o sistema / shell:

[foo@bar path]$ sh --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

Fato engraçado: se esse script for chamado por um cronjob, os pontos de interrogação não ocorrerão. Somente se eu executar manualmente o script.

Gottlieb Notschnabel
fonte
Geralmente, ?indica que um caractere não pode ser exibido. Certamente soa como uma diferença de codificação. Você pode nos dar a saída de env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L A saída é LANG=en_US.UTF-8.
Gottlieb Notschnabel
desculpe por não estar claro. Eu quis dizer a saída em ambas as extremidades.
0xC0000022L
Desculpe por falta disso ... Infelizmente este comando não
gera
1
Você está ciente de que esta sequência de redirecionamentos ( 2>&1 >> $FILE) envia stderr para o terminal e stdout para o arquivo? Se você quiser stderr para ir para o arquivo, bem como, o que você precisa>> $FILE 2>&1
glenn jackman

Respostas:

17

Você provavelmente possui alguns caracteres não imprimíveis no final das linhas (por exemplo, CRLF do Windows), execute:

cat -A scriptname

na máquina remota, ele mostra todos os caracteres em seu script. Em seguida, você pode converter para o formato unix, executando

dos2unix scriptname
fazie
fonte
3

O Notepad ++ foi muito útil para corrigir isso depois de tentar a resposta

cat -A scriptname>

dos2unix scriptname

pois isso ainda apresentava erros ao tentar converter.

Através do Notepad ++, existe a opção no menu editar / Conversão EOL / Formato Unix / OSX.

Ainda aprendi muito, mas esse método resolveu meu problema, no entanto, a solução anterior ajudou a encontrar onde estava o problema.

Phoe
fonte