オプションフラグをtarに渡すためにスーパーフロースダッシュ(-)を使用する理由


35

ディレクトリのtarファイル、作成するtarと、コマンドをcompressverboseおよびfileオプションは、このように入力することができます。

$ tar -cvf my.tar my_directory/

ただし、次のように機能することもできます。

 $ tar cvf my.tar my_directory/

つまり、オプションの前にダッシュ(-)を付けません。オプションリストにダッシュ(-)を渡すのはなぜですか?


回答:


43

UNIXアプリケーションで歴史的に使用されてきたオプションには、いくつかの異なるパターンがあります。tarのようないくつかの古いものは、位置スキームを使用します。

コマンドオプション引数

たとえば、tarは

tar * something * f "ファイル操作" * "操作するファイルのパス" *

混乱を避けるための最初の試みでは、tarおよび古いフラグ引数スタイルの他のいくつかのプログラムでダッシュでフラグを区切ることができましたが、ほとんどの老人は単にそれを無視しました。

他のコマンドには、より複雑なコマンドライン構文があります。dd(1)は、フラグ、等号、パス名、引数、およびナシの木のヤマウズラを使用します。

unixのBSD以降のバージョンでは、これは多かれ少なかれ '-'でマークされた1文字のフラグに収束していましたが、いくつかの問題が発生し始めました。

  • フラグは覚えにくいかもしれません
  • 時々あなたは実際に「-」で名前を使いたいと思った
  • 特にGNUツールでは、可能なフラグの数によって制限が課され始めました。そのため、GNUツールはのようなGNU長いオプションを追加しました--output

その後、Sunは余分な「-」が冗長であると判断し、単一の「-」で長いスタイルのフラグを使用し始めました。

そして、それが今の混乱になった理由です。


9
「そしてナシの木のヤマウズラ」私の乾いた試みよりも良い。あなたが勝ちます。
dmckee

1
素敵な歴史的背景。

1
多くのXプログラム(たとえば、XorgのXなど)は、単一ので長いスタイルのフラグを使用してい-ます。それは太陽からですか?
mattdm

1
「ナシの木のヤマウズラ」の意味は何ですか?(便利で理解しやすいリンクはありますか?)
plhn

1
@plhnイディオム。伝統的な英国のクリスマスキャロル「クリスマスの12日間」には、「ナシの木のヤマウズラ」で終わる贅沢な贈り物がたくさんあります。それは長く贅沢なリストを示唆しています。
チャーリーマーティン

8

tar -c -f foo -v -B file1 file2 file3コマンドラインの最後でオプションとパラメータまたはファイル名を区別するためにダッシュが必要な標準のUNIXの方法でtarオプションを指定できます。または、すべてのオプションを最初の引数にまとめることができます。この場合、ダッシュはオプションです。

次にps、SysV-ishオプションを使用している場合はダッシュを使用し、BSD-ishオプションを使用している場合はダッシュを使用します。

そして、話すらしませんfind


2

ダッシュは、オプションのパラメーター名と値を明確にするために使用されます。もっと標準的な慣習だと思います。


1
best-practiceタグを追加するつもりだったのは、その結果になるかもしれないと思ったからです。

1
@Milktrader、ベストプラクティスについて話すとき、それは難しい質問です。標準的な規則に従うことは確かにベストプラクティスですが、あなたのケースでそれをしたいかどうかは明らかではありません。シナリオによって異なります。シェルでいくつかのクイックコマンドをハッキングする場合、おそらくそれはあまり気にしませんが、ライブラリを作成する場合は、このライブラリの使用方法を制御できないため、確立された規則に従うことが重要ですクライアントによって。この場合、考えられるすべてのケースをカバーする必要があり、オプション名と値の間の曖昧さを取り除くことが重要です。

-1

UNIXコマンドラインオプションを使用するには、最大4つの規則があります。

  1. -o -p -t (各オプションの前にダッシュ)
  2. -opt (オプションセットの前にダッシュ)
  3. opt (オプションセットの前にダッシュなし)
  4. --long-option (オプション名の前の二重ダッシュ)

例えば:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
この規則はtarにのみ適用されますか?lsはどうですか?ls lrtは機能しませんが、ls -lrt / ls -l -r -tは機能します。なぜそうなのか?
シャシャンク・ビャス

4つの規則はすべてのコマンドで機能するはずです。
jonasjacek

2
いいえ、そうではありません。先日、rm rf <filename>を試しましたが、これも機能しません。
Shashank Vyas

-2

先頭のマイナス記号(-)を使用すると、オプションを正確な順序に保つ必要があります。オプションのマイナス順が変更される可能性があります。

例えば:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

この答えは半分正しいですが、私の知る限り、fそのようなフラグは順序が重要な引数を取るだけです。unix.stackexchange.com/a/239120/3169
Mikel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.