リモートマシンでスクリプトを実行すると、ファイル名に疑問符が含まれるのはなぜですか?


10

現在の日付をフェッチし、PHPスクリプトを実行して、出力(およびエラー)を現在の日付を含むファイル名にリダイレクトする小さなスクリプトがあります。

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

このスクリプトをローカルマシン(Windows 7、Aptana IDE)で実行すると、PHPスクリプトは正常に動作し、ログファイルには予期されたファイル名(例:)が含まれます20140502.log

しかし、そのスクリプトをSFTP経由でリモートマシンにプッシュしてそのスクリプトを実行すると、ファイル名は次のようになります。

20140502?.log?

何が問題でしょうか?これはencondingエラーですか(たとえば、SFTPアップロードのエンコーディングはANSIIであり、UTF-8が期待されます)?または、スクリプト自体で何かを変更する必要がありますか?

システム/シェルに関する情報:

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

面白い事実:そのスクリプトがcronjobによって呼び出された場合、疑問符は発生しません。スクリプトを手動で実行した場合のみ。


通常、?は文字を表示できないことを示します。確かにエンコーディングの違いのように聞こえます。の出力を教えていただけますenv|grep -E '(LC|LANG)'か?
0xC0000022L 2014年

@ 0xC0000022L出力はLANG=en_US.UTF-8です。
Gottlieb Notschnabel 2014年

不明瞭で申し訳ありません。両端の出力を意味しました。
0xC0000022L 2014年

それを逃してすみません...残念ながら、このコマンドはWindozeでは何も出力しません:/
Gottlieb Notschnabel

1
この一連のリダイレクト(2>&1 >> $FILE)が端末にstderrを送信し、ファイルにstdoutを送信することを知っていますか?stderrもファイルに移動する場合は、次のものが必要です>> $FILE 2>&1
glenn jackman

回答:


17

おそらく、行末に印刷できない文字(WindowsのCRLFなど)がある場合は、次のコマンドを実行します。

cat -A scriptname

リモートマシンでは、スクリプト内のすべての文字が表示されます。次に、実行中のunixのような形式に変換できます。

dos2unix scriptname

3

回答を試みた後、これを修正するためにNotepad ++が非常に役立つことがわかりました

cat -Aスクリプト名>

dos2unixスクリプト名

変換しようとするとエラーが発生するためです。

Notepad ++を通じて、編集メニュー/ EOL変換/ Unix / OSX形式にオプションがあります。

まだ非常に学習者ですが、この方法は私の問題を解決しましたが、以前の解決策は問題がどこにあるかを見つけるのに役立ちました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.