Pourquoi le nom de fichier contient-il des points d'interrogation lorsque j'exécute un script sur ma machine distante?

10

J'ai un petit script qui récupère simplement la date actuelle, exécute un script PHP et redirige la sortie (et les erreurs) vers un nom de fichier contenant la date actuelle.

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

Lorsque j'exécute ce script sur ma machine locale (Windows 7, Aptana IDE), le script PHP fonctionne correctement et le fichier journal a le nom de fichier attendu, par exemple 20140502.log.

Mais lorsque je pousse ce script via SFTP sur ma machine distante et exécute ce script, le nom de fichier ressemble à ceci:

20140502?.log?

Quel pourrait être le problème? S'agit-il d'une erreur de connexion (par exemple, le codage pour les téléchargements SFTP est ANSII, où UTF-8 est attendu)? Ou dois-je changer quelque chose dans le script lui-même?

Informations sur le système / shell:

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

Fait amusant: si ce script est appelé par un cronjob, les points d'interrogation ne se produisent pas. Seulement si j'exécute manuellement le script.

Gottlieb Notschnabel
la source
Habituellement, le ?indique qu'un caractère ne peut pas être affiché. Cela ressemble certainement à une différence de codage. Pouvez-vous nous donner la sortie de env|grep -E '(LC|LANG)'?
0xC0000022L
@ 0xC0000022L La sortie est LANG=en_US.UTF-8.
Gottlieb Notschnabel
désolé d'être flou. Je voulais dire la sortie aux deux extrémités.
0xC0000022L
Désolé d'avoir raté ça ... Malheureusement, cette commande ne produit rien sur Windoze: /
Gottlieb Notschnabel
1
Savez-vous que cette séquence de redirections ( 2>&1 >> $FILE) envoie stderr au terminal et stdout au fichier? Si vous voulez que stderr >> $FILE 2>&1
accède également

Réponses:

17

Vous avez probablement des caractères non imprimables à la fin des lignes (par exemple, CRLF de Windows), exécutez:

cat -A scriptname

sur une machine distante, il vous montrera tous les personnages de votre script. Ensuite, vous pouvez convertir au format unix en cours d'exécution

dos2unix scriptname
fazie
la source
3

Notepad ++ trouvé très utile pour corriger cela après avoir tenté la réponse

cat -A scriptname>

dos2unix scriptname

car cela présentait toujours des erreurs lors de la conversion.

Grâce à Notepad ++, il y a l'option dans le menu d'édition / Conversion EOL / Format Unix / OSX.

J'apprends toujours beaucoup mais cette méthode a résolu mon problème, mais la solution précédente a aidé à trouver où était le problème.

Phoe
la source