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.
la source
?
indique qu'un caractère ne peut pas être affiché. Cela ressemble certainement à une différence de codage. Pouvez-vous nous donner la sortie deenv|grep -E '(LC|LANG)'
?LANG=en_US.UTF-8
.2>&1 >> $FILE
) envoie stderr au terminal et stdout au fichier? Si vous voulez que stderr>> $FILE 2>&1
Réponses:
Vous avez probablement des caractères non imprimables à la fin des lignes (par exemple, CRLF de Windows), exécutez:
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
la source
Notepad ++ trouvé très utile pour corriger cela après avoir tenté la réponse
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.
la source