tarとそのキー文字:バグか機能か?


18

これらの2つのコマンドの違いを尋ねるのが不思議です(つまり、オプションの順序のみが異なります)。

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

最初のものは完全に実行されましたが、2番目のものは言いました:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

そして、タール--test-label-zfxv言った:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

それから私はtarマニュアルを見て、そこにあるすべての例が-f最後にスイッチを使用していることに気付きました!!

AFAICTこの制限は必要ありませんか?私の意見では、スイッチは無料で注文する必要があるためです。


2
@schilyコマンドラインに対する「修正」は、彼が実際に入力したコマンドを曖昧にしました。先頭のダッシュは、GNU tarの動作を変更して別の引数パーサーを使用します。ダッシュを使用しない(したがって従来の引数パーサーを使用する)場合、2番目のコマンドは機能します。
Random832

Webシステムからのデルタ印刷は、あなたまたは誰かが-を追加する前に私に言ったので、システムから私が言ったものと一致するために、それを再び削除しました。しかし、あなたが正しいgtar option parsingなら、gtarを使用しない別の理由を発見しました。
気味悪い

1
-f後に続くファイル名が必要です。2番目のバージョンでは、-fxvtarの場合、ファイル名が「xv」であることを意味するを指定しました。
ロルフ

1
義務的なXKCD
パベル

回答:


11

エラーメッセージを見ると、使用しtarたのではなく、を使用していることが明らかですgtar

一般的に、これは物事を理解するのに役立ちます

  • tar通常、常にファイル引数が必要です。欠落している場合、システムのデフォルトの実際のテープデバイスとの間で読み取り/書き込みを行います。star1982年にこれをデフォルトでstdin / stdoutを使用するように変更し、他のtar実装(gtarなど)が最近この例に従っています。

  • tartarコマンドの場合に-呼び出されるオプションの先頭を実装しませんkey letters。いくつかの実装は、後で-ユーザーの利便性のためにノーオペレーションキー文字として追加されましたが、これに頼ることはできません。

  • tar引数(特にアーカイブファイルの引数)を解析する方法は非常に危険です。関連するファイル引数がtarアーカイブファイルとして取得されたため、アーカイブ内にあるファイルの1つを破壊した多くのtarアーカイブを見てきました。starこのため(としてネイティブに呼び出される場合star)、「f」を他のオプションと連結することはできません。starが呼び出されtarた場合tar、コマンドラインとの互換性を実装しますが、「f」キー文字の引数を異なる方法で処理します:引数は、実際のデバイスファイルを参照する場合、またはファイルがまだ存在しない場合(書き込みモードで)のみ許可されます。

危険なオリジナルのtarコマンドラインを避け、より安全な最新のコマンドライン構文を使用することをお勧めしstarます。

の問題のあるコマンドライン構文のtarためtar wars、1990年代初頭にはそう呼ばれていました。その結果、プログラムpax(タール戦争における「平和」のラテン語)が作成され、標準化されました。paxただし、その構文はtar構文よりもリスクが低く、直感的でもないため、人気はありませんでした。別の問題として、gpax多かれ少なかれメンテナンスされていないことがあります。


3
タール戦争は終わりました。ガンターが勝った。
ジョシュア

2
あなたが正しかったなら、すべてのtar実装が機能をコピーするのはなぜstarですか?
気味悪い

1
ところで:タール戦争はtarとの間の戦いcpioでした。
気味悪い

2
OK、それはそうそうstarのは-f"$file"(他にもあるind)で始まるファイル名での問題=。そのため、-f="$file"またはのいずれかで記述する必要があります-f "$file"。あなたのスターオプションをより安全モダンか解析するかどうかはわかりません。
ステファンシャゼラス

3
-longスタイルの長いオプションは、圧縮された-xyz短いオプションまたはと互換性がありません-xarg。そのため、X11スタイルの長いオプションでは、短いオプションを分離する(-x -y、not -xy)必要があり、オプションの引数は別個の引数(xterm -n foo、not xterm -nfoo)にする必要があります。そして、それがGNUの長いオプションに余分なダッシュがあり、短いオプションとの混乱を排除し、GNUスタイルの長いオプションがより良い設計である理由です。あなたは持つことができる-fooとの共存を-x -y -xyあなたは重複を避けるために非常に注意している場合にのみ。
ステファンシャゼラス

55

スイッチの順序は自由-fですが、tar読み取り/書き込みを行うファイルである必須の引数があります。

できる

tar -zf foo.tar.gz -xv

それは機能し、スイッチの非特定の順序の要件があります。

これは、引数を持つオプションを持つすべてのコマンドが機能する方法です。


5
Tarは、「ar」コマンドと古い(POSIXより前の)「ps」コマンドで使用されるのと同じ、はるかに古いコマンドラインパーサーを使用するため、他のコマンドとは異なります。
schily

1
これに感謝します。選択された答えは、徹底的ではありますが、問題が具体的に何であるかを実際に見ることができませんでした。振り返ってみると、それはタールを示すエラーメッセージがファイル「XV」をお読みしようとしていたから明らかなようだ
ジョシュRumbut

1
として宣言することもできると信じています。-f=./myfileつまり、fは値をとり、フラグではなく、入力です。
ThorSummoner

14

従来、tarのオプション多かれ少なかれ「順序なし」です(両方を指定した場合fbオプションの順序は重要です)。ただし、先頭のダッシュを使用すると、GNU tarは他のコマンドとより整合性があると見なされる方法でオプションを解析します。引数を必要とするオプション(ファイル名などf)存在する場合、引数として(従来、tarは次の単語をファイル名/ブロックサイズとして使用します。fbます。またはが指定されている)。あなたの場合、ファイル名として「xv」を取りました。

ただし、移植性のためにこの動作に依存することはできません。移植性を最大限に高めるには、ダッシュの使用を避け、常にf最後に置き、常にfファイル名との間にスペースを入れてください。ただし、これは、bオプションが必要な場合、または一般的に次のようなオプション(などCf引数を必要とする。

これは、Tarマニュアルのセクション「3つのオプションスタイル」に記載されています。他の実装(FreeBSDなど)では、古いスタイルオプションを「バンドルオプションワード」と呼びます。そしてもちろん、一部の実装ではこのタイプのオプションのみがサポートされ、ダッシュが含まれていても無視されない場合があります。これは、Single Unix Specificationで指定されている呼び出しの唯一の形式であるため、ほとんどすべてのシステムで機能することが保証されています。


2
いくつかの実装は、引数を持つ他のオプションをサポートすることに注意してください(CBSDやGNU tarのように。schilytarはCではなく-Cとしてサポートし、すべては-Cとしてサポートします)。
ステファンシャゼラス

0

tarでは、スイッチの-は何年も前に非推奨になり、もはや必要ありません。タールは実際にあなたにそれを伝えるために使用していましたが、もうしません。

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

Both of these work fine without the -.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.