Linux
tar 及其關鍵字母:它是錯誤還是功能?
我想問一下這兩個命令的區別(即只有它們的選項順序不同):
tar -zxvf foo.tar.gz
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 選項,則它們的順序很重要)
f
。b
然而,使用前導破折號會導致 GNU tar 以一種被認為與其他命令更一致的方式解析選項,其中指定需要參數的選項(例如 的文件名f
)將立即消耗“單詞”的其餘部分,如果有的話,作為參數(傳統上, tar 在指定或時使用下一個單詞作為文件名/塊大小)。在您的情況下,它以“xv”作為文件名。f``b
但是,這種行為不能依賴於可移植性。為了獲得最大的可移植性,您應該避免使用破折號,始終放在
f
最後,並始終f
在文件名和文件名之間放置一個空格。但是,如果您需要該b
選項,或者通常除此之外的任何選項(例如C
)f
都需要參數,那麼這種簡化就會失效。這記錄在Tar Manual 部分“三種選項樣式”中。其他一些實現(例如 FreeBSD)將舊式選項稱為“捆綁選項詞”。當然,一些實現可能只支持這種類型的選項,並且可能會或可能不會忽略破折號(如果包含)。這是單一 Unix 規範中指定的唯一呼叫形式,因此保證幾乎可以在所有系統上工作。