web-dev-qa-db-ja.com

`tar -xvfz`が失敗するのに` tar xvfz`は機能するのはなぜですか?

tar -xvfz foo.tar.gzはエラーを返しますtar: z: Cannot open: No such file or directory

これは完全に理解できます。fスイッチはファイル名を想定しているため、最後にする必要があります。

ただし、ハイフンを省略tar xvfz foot.tar.gzは機能し、ファイルを解凍および解凍します。

私はこれをOS X 10.8とUbuntu 12.04でテストしました。

何かアイデアはありますか?

[編集して追加]

私はいつもtar -zxvf foo.tar.gz。ただし、この質問は this xkcd が原因で発生し、誰かがtar xvfzは機能します。

enter image description here

41
anu

tarには3種類の構文があります( this に従って):

  • 長いオプション(--file)
  • 短いオプション(-f)
  • 古いオプション(f)

古いオプション構文では、すべての文字が「tar」の後に続き、すべてスペースなしの単一のまとまりに該当する必要があります。オプションの束の後、それらの文字に対する引数が同じ順序に従う限り、文字の順序は実際には重要ではありません。

この古いtarオプションの記述方法は、経験豊富なユーザーでも驚きます。たとえば、次の2つのコマンド:

 # tar cfz archive.tar.gz file
 # tar -cfz archive.tar.gz file

かなり違います。最初の例では、オプション「f」の値として「archive.tar.gz」を使用し、オプション「z」を認識しています。ただし、2番目の例では、オプション「f」の値として「z」を使用しています。これはおそらく意図したものではありません。

古いオプションは、古いバージョンのtarとの互換性のために残されています。

「-」を使用したコマンドは、次と同等です。

tar -czf archive.tar.gz file
tar -cf archive.tar.gz -z file
tar cf archive.tar.gz -z file

これが、「-」なしではなく「-」なしで例が機能する理由です

61
Napster_X