web-dev-qa-db-ja.com

Shell Command Substitutionが末尾の改行文字をむちゃくちゃにするのはなぜですか?

次の例のように、 私の最近の質問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

シェルアクション、つまりコマンド置換から、実際に置換されているコマンド出力から一部のデータを削除するには、いくつかのveryシェルアクションの重要な理由があると思います...
しかし、それが何であるかの正反対であるように思われるため、私はこの問題に頭を悩ませることはできません想定実行する必要があります。コマンドの出力をスクリプトプロセスに戻すには... 1文字を保留するのは奇妙に思えますが、それには理にかなった理由があると思います...その理由が何か知りたいと思っています。 。

26
Peter.O

シェルはもともと完全なプログラミング言語を意図したものではなかったからです。

コマンド出力から末尾の_\n_を削除するのは非常に困難です。ただし、表示の目的で、ほとんどすべてのコマンドの出力は_\n_で終わります。そのため、別のコマンドで使用する場合は、簡単に削除する必要があります。 $()構造による自動削除がソリューションとして選択されました。

それで、おそらくあなたはこの質問を答えとして受け入れるでしょう:

次のコマンドでこれが自動的に行われなかった場合、末尾の_\n_を削除する簡単な方法を見つけることができますか?

_> echo The current date is "$(date)", have a good day!
_

書式設定された日付に表示される可能性のある二重スペースのスマッシュを防ぐために、引用符が必要であることに注意してください。

22

標準 の一部です:

シェルは、サブシェル環境でcommandを実行し( Shell Execution Environment を参照)、コマンド置換(command+囲み "$()"またはバッククォート)をコマンドの標準出力とともに使用して、置換の最後にある1つ以上の<newline>のシーケンスを削除します。

もちろん、標準はおそらくkshがそのようにしたのでこのように書かれていますが、それは標準であり、動作が文書化されています。気に入らない場合は、末尾の改行を維持できるPerlなどを使用してください。

19

まあ、それは私には理にかなっています。改行は最初の場所、つまり通常のコマンド出力にのみ存在するため、コマンドが新しい行で完了するとプロンプトが表示されます。ほとんどの場合、改行は元の出力の一部ではなく、画面を整頓するためにあります。コマンドからの出力を解析しているとき、最後の改行は通常厄介です。 wcコマンドが2行のテキストを出力するのはなぜですか?ああ、それはしません、それは改行が続く1を出力します。 wcを解析するとき、出力が2行あるという事実について心配する必要はありません。実際にはありませんが、1行しかありません。

6
EightBitTony

私は同じ問題に遭遇しており、以下の例を見つけました。引用は状況を助けたようです、少なくとも私にとってはそうでした:

http://tldp.org/LDP/abs/html/commandsub.html

dir_listing=`ls -l`
echo $dir_listing     # unquoted

# Expecting a nicely ordered directory listing.

# However, what you get is:
# total 3 -rw-rw-r-- 1 bozo bozo 30 May 13 17:15 1.txt -rw-rw-r-- 1 bozo
# bozo 51 May 15 20:57 t2.sh -rwxr-xr-x 1 bozo bozo 217 Mar 5 21:13 wi.sh

# The newlines disappeared.


echo "$dir_listing"   # quoted
# -rw-rw-r--    1 bozo       30 May 13 17:15 1.txt
# -rw-rw-r--    1 bozo       51 May 15 20:57 t2.sh
# -rwxr-xr-x    1 bozo      217 Mar  5 21:13 wi.sh
1