Linux

tar 及其關鍵字母:它是錯誤還是功能?

  • October 12, 2015

我想問一下這兩個命令的區別(即只有它們的選項順序不同):

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

第一個執行完美,但第二個說:

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

並 tar--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最後都是用switch!!

AFAICT不需要這個限制,還是有?!因為在我看來,開關應該是免費的。

開關的順序是免費的,但-f有一個強制參數,即tar要讀/寫的文件。

你可以做

tar -zf foo.tar.gz -xv

這將起作用,並且您需要非特定的開關順序。

這就是所有具有帶參數的選項的命令的工作方式。

傳統上,tar 的選項或多或少是“無順序的”(如果同時指定了 and 選項,則它們的順序重要)fb然而,使用前導破折號會導致 GNU tar 以一種被認為與其他命令更一致的方式解析選項,其中指定需要參數的選項(例如 的文件名f)將立即消耗“單詞”的其餘部分,如果有的話,作為參數(傳統上, tar 在指定或時使用下一個單詞作為文件名/塊大小)。在您的情況下,它以“xv”作為文件名。f``b

但是,這種行為不能依賴於可移植性。為了獲得最大的可移植性,您應該避免使用破折號,始終放在f最後,並始終f在文件名和文件名之間放置一個空格。但是,如果您需要該b選項,或者通常除此之外的任何選項(例如Cf都需要參數,那麼這種簡化就會失效。

這記錄在Tar Manual 部分“三種選項樣式”中。其他一些實現(例如 FreeBSD)將舊式選項稱為“捆綁選項詞”。當然,一些實現可能支持這種類型的選項,並且可能會或可能不會忽略破折號(如果包含)。這是單一 Unix 規範中指定的唯一呼叫形式,因此保證幾乎可以在所有系統上工作。

引用自:https://unix.stackexchange.com/questions/231265