他のほとんどの人が観察したように、「-n」は、echo
コマンドの直後以外のどこかに置かれた場合、文字どおりに解釈されます。
歴史的に、UNIXユーティリティはすべてこのようなものでした-コマンド名の直後にのみオプションを探していました。今でもPOSIXは古い方法を正しいと指定しているため(ガイドライン9およびman 3 getopt
Linuxシステムでも)、より柔軟なスタイルを開発したのはおそらくBSDまたはGNUでした。とにかく、最近のほとんどのLinuxユーティリティは新しいスタイルを使用していますが、などのいくつかのホールドアウトがありecho
ます。
Echo
POSIXが登場するまでに、少なくとも2つの根本的に矛盾するバージョンが機能していたという点で、標準的には混乱しています。一方では、バックスラッシュでエスケープされた文字を解釈する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がそれに柔軟なオプションスキームを使用した場合、地獄は壊れるでしょう。
ちなみに、Bourneシェルの実装間の最適な互換性のために、ではprintf
なくを使用してくださいecho
。
echo
特に柔軟なオプションを使用しない理由を説明するために更新されました。
echo -n "bar"
「bar」をecho "bar" -n
与える一方、「bar -n」を与える