Cygwinで実行しているシェルスクリプトがあります(これが問題である可能性があります)。このコードのビットでは、最初の行を書き、改行を追加するだけです。
echo "`date` User `whoami` started the script." >> output.log
echo >> output.log
しかし、output.logファイルは決して中断しないようです。スクリプトを複数回実行すると、2番目のエコーがファイルに書き込まれないかのようになります。
私も試しました:
echo -e "`date` User `whoami` started the script.\n" >> output.log
同じ結果が得られます。
奇妙なことに、ファイルに追加せずにコマンドラインで上記の2番目のechoステートメントを入力すると、末尾の改行で期待される出力が得られます。
問題は、CygwinがUnixの行末(LF)をファイルに書き込んでおり、Windowsの行末(CRLF)を予期するプログラムで開いていることです。これが当てはまるかどうかを判断するために、そしてちょっとしたハックの回避策のために、試してください:
echo "`date` User `whoami` started the script."$'\r' >> output.log
(どこ $'\r'
の最後は、余分なキャリッジリターンです。それに加えて、Unixの行末は、Windowsの行末になります)。
試してください:
echo "`date` User `whoami` started the script."$'\n' >> output.log
あるいは単に:
echo $'\n' >> output.log
試して
echo -en "`date` User `whoami` started the script.\n" >> output.log
これを複数回発行してみてください。同じ出力を探しているといいのですが。
I/Oリダイレクトなしでそれを行うことができます。
sed -i 's/$/\n/' filename
このコマンドを使用して、ファイルのリストに改行を追加することもできます。
find dir -name filepattern | xargs sed -i 's/$/\n/' filename
echo
の場合、一部のシェルはシェル組み込みコマンドとして実装します。 -e
オプションを受け入れない場合があります。それでもecho
を使用する場合は、which echo
を使用して、echo
バイナリファイルの場所を見つけてください。ほとんどの場合、/bin/echo
にあるため、/bin/echo -e "\n"
を使用して新しい行をエコーできます。