为什么 rm 手册说我们可以在没有任何参数的情况下运行它,而事实并非如此?

S.M*_*lam 26 linux man rm arguments

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

rm [OPTION]... [FILE]...
Run Code Online (Sandbox Code Playgroud)

这不是意味着我们只能使用rm命令而没有任何选项或参数吗?
当我自己运行命令rm时,终端会显示以下错误:

rm: missing operand
Try 'rm --help' for more information.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么会这样?

Kus*_*nda 46

rm实用程序的标准概要在 POSIX 标准1&2 中指定为

rm [-iRr] file...
rm -f [-iRr] [file...]
Run Code Online (Sandbox Code Playgroud)

在第一种形式中,它确实需要至少一个文件操作数,但在第二种形式中则不需要。

这样做rm -f有没有文件操作数是不是一个错误:

$ rm -f
$ echo "$?"
0
Run Code Online (Sandbox Code Playgroud)

...但它只是没有做太多。

该标准说,对于该-f选项,rm实用程序应该......

不提示确认。在没有文件操作数或操作数不存在的情况下,不要写入诊断消息或修改退出状态。任何先前出现的-i选项都将被忽略。

这确认必须可以在rm -f没有任何路径名操作数的情况下运行,并且这不会导致rm退出并出现诊断消息或非零退出状态。

这个事实在试图删除许多文件的脚本中非常有用

rm -f -- "$@"
Run Code Online (Sandbox Code Playgroud)

where"$@"是路径名列表,可能为空,也可能不为空,或者可能包含不存在的路径名。

rm -f如果存在阻止删除命名文件的权限问题,仍将生成诊断消息并以非零退出状态退出。)

运行既没有选项也没有路径名操作数的实用程序是一个错误:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1
Run Code Online (Sandbox Code Playgroud)

这同样适用于 GNU rm(上面显示的是 OpenBSD rm)和同一实用程序的其他实现,但确切的诊断消息和非零退出状态可能不同(在 Solaris 上该值为 2,在 macOS 上为 64,例如)。

总之,GNUrm手册可能有点不精确,因为确实有一些选项(-f,这是一个可选选项),路径名操作数是可选的。


1自2016版以来,解决此bug后,请参阅上一版以供参考。
2 POSIX 是定义 Unix 系统及其行为方式的标准。该标准由The Open Group 发布。另请参阅问题“ POSIX 到底是什么? ”。

  • 啊。使用 -f 来避免在不需要删除文件的情况下出现错误是......令人担忧——因为它也会忽略文件是不可写的 (4认同)
  • @Grump 您可能遇到的唯一问题是 _directory_ 不可写(或不可访问)。删除文件需要对其父目录的修改访问权限,而不是文件本身(因为文件数据未修改)。您可以删除任何文件,只要您在包含它的目录中拥有 `w` 和 `x` 权限,无论该文件的所有权或权限是什么。 (3认同)
  • @Grump 很抱歉,但我不知道使用 `rm -f` 会产生什么其他副作用而不是删除文件...如果您有不想删除的文件,请不要根本不要对它们使用 `rm`。我真的不明白这与使用不带参数的 `rm` 有什么关系。如果脚本不想在没有确认的情况下删除文件,它就不会使用 `rm -f`。标准是这样说的:“不提示确认。” GNU `rm` 手册说“从不提示”。 (3认同)
  • @Grump 不。使用 `rm -f` 不会“删除”任何错误。在空文件列表上使用 `rm -f` 没有错误,因此没有要删除的错误。`rm -f` 接受一个空列表。使用 `-f` 和 `rm` 也会删除所有提示,这从我引用的文本中很明显,但不是问题的重点。如果没有控制终端,或者如果标准输入从 `/dev/null` 重定向,不带 `-f` 的 `rm` 也会删除写保护的文件。这些是脚本无话可说的外部条件。依赖于命令行提示可能很有用,但在脚本中很少。 (3认同)

Ste*_*itt 9

从技术上讲,概要是正确的,但令人困惑。有些情况下不需要文件名:

rm --help
rm --version
Run Code Online (Sandbox Code Playgroud)

(使用 GNU 时rm)。所有其他情况都需要文件名。

其他版本rm的文件显示为非可选,例如OpenBSD 手册页中

更准确的 GNU 概要rm将显示三个变体:

rm[选项...]文件...
rm --help
rm --version

  • 它是 100% 准确的,但并不准确。 (2认同)