現在の日付を取得し、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?
何が問題なのでしょうか?エンコードエラーですか(例:SFTPアップロードエンコーディングはANSIIですがUTF-8が必要です)?それともスクリプト自体で何かを変更する必要がありますか?
システム/シェルに関する情報:
[foo@bar path]$ sh --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
面白い事実:cronjobによってスクリプトが呼び出されると、疑問符は表示されません。スクリプトを手動で実行する場合のみ。
答え1
行の末尾に印刷できない文字がある可能性があります(たとえば、WindowsのCRLF)。以下を実行してください。
cat -A scriptname
リモートコンピュータでは、スクリプトのすべての文字が表示されます。その後、Unixシリーズ形式に変換して実行できます。
dos2unix scriptname
答え2
答えを試した後、この問題を解決するためにNotepad ++が非常に役に立つことがわかりました。
cat -A スクリプト名 >
dos2unix スクリプト名
変換しようとするとエラーが発生するためです。
Notepad ++を使用している場合、このオプションは編集メニュー/ EOL変換/ Unix / OSX形式で見つけることができます。
まだ学習者ですが、この方法で問題は解決しましたが、以前の解決策が問題を見つけるのに役立ちました。