Linux

為什麼 rm 手冊說我們可以在沒有任何參數的情況下執行它,而事實並非如此?

  • November 25, 2019

我們可以看到rm命令的概要是:

rm [OPTION]... [FILE]...

這是否意味著我們只能使用rm沒有任何選項或參數的命令?

當我自己執行命令rm時,終端會顯示以下錯誤:

rm: missing operand
Try 'rm --help' for more information.

誰能告訴我為什麼會這樣?

rm實用程序的標準概要在 POSIX 標準1&2中指定為

rm [-iRr] file...
rm -f [-iRr] [file...]

在第一種形式中,它確實需要至少一個文件操作數,但在第二種形式中則不需要。

rm -f使用文件操作數不是錯誤:

$ rm -f
$ echo "$?"
0

……但它並沒有做太多。

該標準規定,對於該-f選項,rm實用程序應…

不要提示確認。在沒有文件操作數或操作數不存在的情況下,不要編寫診斷消息或修改退出狀態。任何先前出現的-i選項都應被忽略。

這證實了它必須可以在rm -f沒有任何路徑名操作數的情況下執行,並且這不是導致rm帶有診斷消息的退出或非零退出狀態的東西。

這個事實在試圖刪除多個文件的腳本中非常有用

rm -f -- "$@"

where"$@"是一個路徑名列表,可能為空也可能不為空,或者可能包含不存在的路徑名。

(如果存在阻止命名文件被刪除的權限問題rm -f,仍將生成診斷消息並以非零退出狀態退出。)

但是,在既沒有選項也沒有路徑名操作數的情況下執行該實用程序是一個錯誤:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

同樣適用於 GNU rm(上面顯示 OpenBSD rm)和相同實用程序的其他實現,但確切的診斷消息和非零退出狀態可能不同(在 Solaris 上值為 2,在 macOS 上為 64,例如)。

總之,GNUrm手冊可能有點不精確,因為確實有一些選項 ( -f,這是一個可選選項),路徑名操作數是可選的。


1自2016版起,解決此bug後,請參考上一版

2 POSIX 是定義什麼是 Unix 系統及其行為方式的標準。本標準由The Open Group出版。另請參閱問題“ POSIX 到底是什麼? ”。

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