変数からコマンド出力をキャプチャするときに改行(\ n)を保持する方法

変数からコマンド出力をキャプチャするときに改行(\ n)を保持する方法

簡単な例として、ソースコードファイルがたくさんあります。これらすべてのファイルの "head"コマンド出力を変数に保存したいと思います。

私は試した:

output=$(head $file)

ただし、\n出力を変数に保存すると、すべての文字が自動的に切り捨てられます。

文字を削除せずにコマンド出力をそのまま保存するにはどうすればよいですか\n

答え1

これは「コマンド拡張」の既知のバグ、または$(...)最後`...`の改行が切り捨てられるバグです。

あなたの状況が次の場合:

$ output="$(head -- "$file"; echo x)"     ### capture the text with an x added.
$ output="${output%?}"                    ### remove the last character (the x).

出力値が変更されます。

答え2

output=$(head $file)維持する埋め込み値に改行文字を入れてoutputトリミングします。みんな末尾の改行文字。

違いは変数を参照する方法です。

変数参照を二重引用符で囲みます。たとえば、次のようになります。

echo "$output"

埋め込み改行文字を印刷しますが、いいえ末尾の改行文字はコマンド拡張によって削除されます$(...)

これは、シェルが$(...)二重引用符内のドル記号、コマンド拡張(バックティックおよび)、およびバックスラッシュのみを解釈するために機能します。二重引用符内にある場合、シェルはスペース(改行を含む)をフィールド区切り文字として解釈しません。

答え3

また、終了状態を維持します。

output=$(head < "$file"; r=$?; echo /; exit "$r")
exit_status=$?
output=${output%/}

一部の文字のエンコーディングが のエンコーディングで終わる一部のロケールで使用されるよりも、一部の文字セットを使用する方が/安全であることに注意してください。あります)。xx/

関連情報