echo "bar" -nがecho -n "bar"と異なるのはなぜですか?

echo

比較する

echo -n "bar"

そして

echo "bar" -n

前者は何をするか。この作業(改行なしで「バー」印刷)を実行する必要があると思いますが、そうではありません。これはバグですか、それとも意図されていますか?多くのCLIプログラムとは異なり、オプションを移動できないのはなぜですか?たとえば、tail -f /var/log/messagesとまったく同じですtail /var/log/messages -f。内部的には、オプションとパラメータが頻繁に再配置されるため、前者を望むことを忘れたときに後者を実行することがあります。選択項目のインポート

修正する:はい、最初は質問を弱めました。いくつかの答えを理解するために記録を見なければならないというナフを削除しました。

ベストアンサー1

他のほとんどの人が観察したように、「-n」がコマンドの後ろ以外の場所に配置されると、文字通り解釈されますecho

歴史的にUNIXユーティリティはこんな感じでした。つまり、コマンド名の直後にあるオプションのみを探します。 BSDやGNUがより柔軟なスタイルを開拓した可能性が高い(私は間違っているかもしれませんが)。POSIX は、以前の方法が正しいことを指定します。(ガイド9参照およびman 3 getoptLinuxシステムの場合)。とにかく、ほとんどのLinuxユーティリティは今新しいスタイルを使用しますがecho

Echo標準的な観点から見ると混乱です。なぜなら、少なくとも次のようなものがあるからです。根本的にクラッシュする2つのバージョンPOSIXが誕生したとき、すでに実行中でした。一方では、バックスラッシュエスケープ文字を解釈しますが、その引数を文字通り処理し、オプションを受け入れないSYSVスタイルがあります。一方、BSDスタイルは最初の文字を-n特別なケースとして扱い、他のすべての文字を文字通り出力します。非常に便利なので、echo特定の動作に依存する何千ものシェルスクリプトがあります。

echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --

「すべてを文字通り処理する」という意味で、echo問題を引き起こすことなく新しいオプションを追加することは不可能です。 GNUが柔軟なオプションスキームを使用した場合、地獄は解放されます。

BTWは、Bourneシェル実装間の最高の互換性のためにprintf代わりに使用echo

修正するecho具体的に柔軟なオプションを使用しない理由を説明してください。

おすすめ記事