以下の例に従い、私の最近の質問 末尾の改行文字はbashからどこに移動しますか?、「なぜ」これが起こるのか知りたいです。
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p
# Output is: 610a62
# The trailing newline from the 'echo' command
# has been "deleted" by Command Substitution
私の考えには確かに少しあると思います。非常にシェル操作(コマンドの置換など)の重要な理由は、実際に代替コマンドの出力から一部のデータを削除することです。
しかし、この質問はその逆のようで、理解できません。しなければならないしないでください。コマンドの出力をスクリプトプロセスに戻す...文字を予約するのは奇妙に見えますが、ここには妥当な理由があると思います...その理由は何か知りたいです...
答え1
シェルはもともと完全なプログラミング言語では意図されていなかったからです。
\n
いくつかのコマンド出力から末尾を削除することは非常に困難です。ただし、表示の目的でほとんどすべてのコマンドは出力で終わるため、\n
他のコマンドで使用したい場合は簡単に削除する方法が必要です。建設とともに自動解体が$()
選択されたソリューションでした。
もしそうなら、おそらくあなたはこの質問を答えとして受け入れるでしょう。
\n
次のコマンドでこれが自動的に実行されない場合は、末尾を削除する簡単な方法を見つけることができますか?
> echo The current date is "$(date)", have a good day!
二重スペースがフォーマットされた日付を破るのを防ぐには、引用符が必要です。
答え2
答え3
まあ、それは私にとって理解されています。改行文字は通常のコマンド出力の最初の位置にのみ表示されるため、コマンドの完了後にプロンプトが新しい行に表示されます。ほとんどの場合、改行文字は生出力の一部ではなく、画面を整理するために使用されます。コマンドの出力を解析するときに末尾の改行はしばしば問題になります。wc
コマンドが2行のテキストを出力するのはなぜですか?いいえ、改行文字が続くものを出力します。解析するときにwc
2行の出力があることを心配したくありません。出力ラインは1つだけです。
答え4
echo "hello "
(引用符なしで)このスペースを占めるのはなぜですか? IFS文字の値はシェル内の区切り文字として扱われるため、末尾の文字(何も区別しない)は削除されます。推奨事項の置き換えは単にサブシェルで推奨事項を実行するため、同じロジックに従います。