web-dev-qa-db-ja.com

シェルスクリプトの出力ファイルに改行を追加する

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ステートメントを入力すると、末尾の改行で期待される出力が得られます。

25
Ode

問題は、CygwinがUnixの行末(LF)をファイルに書き込んでおり、Windowsの行末(CRLF)を予期するプログラムで開いていることです。これが当てはまるかどうかを判断するために、そしてちょっとしたハックの回避策のために、試してください:

echo "`date` User `whoami` started the script."$'\r' >> output.log

(どこ $'\r'の最後は、余分なキャリッジリターンです。それに加えて、Unixの行末は、Windowsの行末になります)。

28
ruakh

試してください:

echo "`date` User `whoami` started the script."$'\n' >> output.log

あるいは単に:

echo $'\n' >> output.log
20
Daniel Haley

試して

echo -en "`date` User `whoami` started the script.\n" >> output.log

これを複数回発行してみてください。同じ出力を探しているといいのですが。

3
Tanbir

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"を使用して新しい行をエコーできます。

3
StarPinkER