私のコマンドの置き換えでは、末尾の改行文字はどこに行きましたか?

私のコマンドの置き換えでは、末尾の改行文字はどこに行きましたか?

以下のコードはこれらの状況を最もよく説明しています。最後の行で末尾の改行文字が出力されないのはなぜですか?各行の出力はコメントに表示されます。私はそれを使用していますGNUバッシュ、バージョン4.1.5

     echo -n $'a\nb\n'                  | xxd -p  # 610a620a  
           x=$'a\nb\n'   ; echo -n "$x" | xxd -p  # 610a620a
     echo -ne "a\nb\n"                  | xxd -p  # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p  # 610a62

ベストアンサー1

コマンド置換関数$()(および近くのいとこ逆引用符)は、特に末尾の改行を削除します。これは記録された行動で、この構成を使用するときは常にこれを知っておく必要があります。

テキスト本文内の改行文字は代替演算子として削除されませんが、シェルから単語を区切ると削除される可能性があるため、結果は引用符を使用するかどうかによって異なります。次の2つの使用法の違いに注意してください。

$ echo -n "$(echo -n 'a\nb')"
a
b

$ !! | xxd -p
610a62

$ echo -n  $(echo -n 'a\nb')
a b

$ !! | xxd -p   
612062

2番目の例では、出力は引用されず、改行文字は単語区切りとして解釈され、出力では空白として表示されます。

おすすめ記事