最近の問題に触発されましたtarコマンドで特定のオプションの順序が重要なのはなぜですか?、質問者がなぜ動作しないのかを知ったら、tar -cfv test.tar *.jpg
後続の質問をしたいと思います。真剣に、なぜできないのですか?
コマンドに-f
パラメーターが必要なオプションと、-v
パラメーターが不要なオプションがある場合は、次のようになります。
cmd -fv foo
2つの異なる方法で解釈できます。v
オプションの引数、-f
オプションfoo
ではない引数、またはfoo
オプションの引数、-f
オプション-v
が存在します。最初の説明はPOSIXがgetopt()
行うことなので、このように実行されるコマンドがたくさんあります。
私は常に2番目の説明を好む。foo
買収を受け取るかどうかに関係なく、すべてのオプションを一緒に梱包する-f
こと。しかし、このような行動はもはやほとんど存在しません。最近私が使用した唯一のコマンドはJavaコマンドです(その構文は明らかにSunのバージョンに触発されました)。-f foo
-ffoo
jar
tar
tar cfv tarfile ...
Xlibには、「個別」引数または「固定」引数を使用してオプションを指定することができるgetopt
同様の機能があります。ただし、長いオプション(など)をXrmParseCommand
処理するため、またはに関連しない他のオプションとして処理されます。したがって、これは私の2番目の解釈の例ではありません。-display
-geometry
-fv
-f
-v
圧縮パラメータがいつ、なぜ支配的になったのですか?この問題はPOSIX以前に解決されましたか?それともPOSIX認証でこの問題が確認されましたか? POSIXの最初のバージョンは、現在のバージョンと同じ特定の要件を持っていますか?古代にこのトピックについて記録された議論はありますか?
=スタイルオプションの解析をサポートするか、歴史的にサポートされている他のコマンド(および他のものtar
)がありますか?jar
-fv foo
-f foo -v
答え1
まず、標準getopt()
スタイルの引数処理では、引数は適用されるオプションに従って圧縮する必要はなく、圧縮できます。したがって、-f
パラメータが承認されると、次の両方が有効です。
command -ffoo positional arguments
command -f foo positional arguments
あなたが「2番目の説明」と呼ぶのは実際には非常にまれです。私が今考えることができる限り、tar
このmt
方法で動作する唯一の既存のコマンドですjar
。スタイルがたくさん違います。オプションは前にも表示されません!なぜほとんど使われないのかは確かに言えませんが、どのオプションがどの引数と一致するのかわかりにくいからです。たとえば、 と引数を取るが、 、 そしてそうでない場合、次のような結果が表示されます。tar
getopt()
-
b
d
a
c
e
command abcde b-argument d-argument
...これは、コマンドを書くときにオプションの文字グループを見直し、再読み込みし、引数を必要とするオプションを覚え、引数を同じ順序で書く必要があることを意味します。これはどうですか?
command adcbe b-argument d-argument
そう、このd
オプションはb-argument
逆になりました。さらに悪いことは次のとおりです。
command lmnop foo bar baz
...コマンドに慣れておらず、どのパラメータがどのオプションで使用されるのかわかりません。foo
、、、bar
およびは、、、(および引数を取らない)の引数です。baz
またはおよびは、位置引数...または他の可能な組み合わせと一緒にすることができます。n
o
p
l
m
foo
bar
m
p
baz