web-dev-qa-db-ja.com

tarとそのキーレター:バグか機能か

これらの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はこう言った:

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はこの制限の必要はありませんか、それともありますか?私の見解では、スイッチは注文不要であるためです。

18
khikho

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

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

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

  • tarは、tarコマンドの場合に-と呼ばれるオプションの先頭のkey lettersを実装しません。一部の実装では、ユーザーの便宜のために-を何もしないキー文字として追加しましたが、これに依存することはできません。

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

危険な元のtarコマンドラインを使用せず、starで得られる最新の安全なコマンドライン構文を使用することをお勧めします。

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

11
schily

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

あなたができる

tar -zf foo.tar.gz -xv

そしてそれはうまくいき、スイッチの特定の順序ではないというあなたの要件があります。

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

55
wurtel

従来、tarのオプション多かれ少なかれ「オーダーフリー」です(fおよびbオプションの順序)両方が指定されている場合は問題ありません)。ただし、先行ダッシュを使用すると、GNU tarは、引数を必要とするオプション(f)は、残りの「Word」があれば、それを引数としてすぐに消費します(通常、tarはnextWordをファイル名として使用します)/fまたはbが指定されている場合のブロックサイズ)この場合、ファイル名として「xv」が使用されました。

ただし、この動作を移植性に依存することはできません。移植性を最大限にするには、ダッシュの使用を避け、常にfを最後に置き、fとファイル名の間に常にスペースを入れます。ただし、これはbオプション、または一般に引数を必要とするC以外のオプション(fなど)が必要な場合に機能しなくなる単純化です。

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

14
Random832

Tarでは、スイッチの-は何年も前に廃止されており、不要になりました。タールは実際にそれを言うために使用しましたが、もはやしません。

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

Both of these work fine without the -.
0
Paul