比較する
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 getopt
Linuxシステムの場合)。とにかく、ほとんどの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
具体的に柔軟なオプションを使用しない理由を説明してください。