次のコードがあるとしましょう。
a=$(echo -e "a\n\n\n")
echo "_${a}_"
出力は_a_です。少し驚きました。なぜこれが起こるのかご存知ですか?
答え1
bash の基盤となる Bourne シェルが 40 年前にこの作業を開始したからです (バックティックからへの構文変更につながり、$(...)
標準で要求する)。
zsh、ksh、yashなどを含むがこれらに限定されない他のすべての同様のシェルにも同様に適用されます。
明確な理由もありません(事後合理化のみ可能)。しかし、次のように簡単に解決できます。
a=$(some_command; echo x); a=${a%x}
バックティックはcshで異なる動作をします。ここで、出力はスペース(または内部の場合はスペースと混合された改行"..."
)の単語に分割され、末尾の改行は単一のスペースになります。
printf 'a\n\n\n' > file
csh -c 'echo `cat file`b'
a b
逆引用符/コマンド置換機能を持つ他のプログラミング言語(PerlやPHPなど)には、これらの欠点はなく、コマンドの正確な出力をキャプチャします。
perl -e 'print qx(printf "a\n\n")."b\n"'
a
b