rm -rf返回码


9

任何人都可以让我知道rm -rf命令的可能返回码,而不是零,即失败情况下的可能返回码。我想知道命令失败的更多详细原因,不只是命令失败(返回0以外)。

shell  unix 

3
@ØHankyPankyØ我实际上对rm联机帮助页没有描述可能的退出状态代码感到惊讶。如果您man ls使用的是Ubuntu,它将说明退出状态为非零的原因
SheetJS 2013年

其值大于0。如有错误。
阿伦(Arun)

6
我不同意从SO进行迁移,因为OP对返回码感兴趣,所以很有可能这是脚本/编程问题。
AdrianFrühwirth2013年

顺便说一下,我对它可以返回的场景数量很感兴趣。会依赖于操作系统吗?

有点对自己的迁移感到生气...几乎获得了逆转成就= P
Matt Joyce

Answers:


8

要查看返回码,可以echo $?在bash中使用。

为了了解实际含义,某些平台(例如Debian Linux)具有perror可用的二进制文件,可以按以下方式使用:

$ rm -rf something/; perror $?
rm: cannot remove `something/': Permission denied
OS error code   1:  Operation not permitted

rm -rf自动消除大多数错误。您将看到的最有可能的错误是1(不允许操作),如果您没有删除文件的权限,则会发生此错误。 -f故意消除大多数错误


3
+1提及perror。在我的系统上,它与mysql一起提供。
AdrianFrühwirth2013年

在诊断方面,strace可能会更好。
马特·乔伊斯

@MattJoyce strace告诉您系统调用是否失败,但是除非您查看源代码,否则您不知道syscall与程序退出状态之间的关系(例如,如果在中运行-fENOENT则被抑制)。因此,这与此处
无关-SheetJS

1
@MattJoyce syscall失败与程序报告错误之间有区别,问题是询问程序退出状态。
SheetJS

1
真正。请注意,您正在寻找RM的来源...那里确实没有太多活动。
Matt Joyce 2013年

2

从git那里抢走了coreutils ....

看着出口,我们看到...

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i exit
  if (status != EXIT_SUCCESS)
  exit (status);
  /* Since this program exits immediately after calling 'rm', rm need not
  atexit (close_stdin);
          usage (EXIT_FAILURE);
        exit (EXIT_SUCCESS);
          usage (EXIT_FAILURE);
        error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
        exit (EXIT_SUCCESS);
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

现在查看状态变量...。

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i status
usage (int status)
  if (status != EXIT_SUCCESS)
  exit (status);
  enum RM_status status = rm (file, &x);
  assert (VALID_STATUS (status));
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

看来退出状态并没有太多事情发生。

我看到的是EXIT_FAILURE和EXIT_SUCCESS,什么都没有。

所以基本上是0和1 / -1

要查看特定的exit()系统调用及其在流程中的发生方式,请尝试以下操作

openfly@linux-host:~/ $ strace rm -rf $whatever 

相当简单。

参考:

http://www.unix.com/man-page/Linux/EXIT_FAILURE/exit/


不明白为什么,向我+1。POSIX也只说了真的0 / >0
AdrianFrühwirth2013年

2
尽管这可能是部分正确的,但它无法回答OP的问题,I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)因此可以理解反对票。
Prix

1
@AdrianFrühwirthEXIT_FAILURE为1: “在POSIX系统,该宏的值是1”(gnu.org/software/libc/manual/html_node/Exit-Status.html
SheetJS

Adrian那里有EXIT_FAILURE的引用,甚至它的linux手册页都表明它在其他平台上可能有所不同。所以我想我也建议。
马特·乔伊斯

1
您正在查找的失败消息在实际的删除文件代码中...对于busybox,您可以修补git.busybox.net/busybox/tree/libbb/remove_file.c ...为每个if (!(flags & FILEUTILS_FORCE)) {添加一个,else{printf("same error message as perror");}我确定其他实现会相似,但如果不是,busybox版本可以自己构建并包含在内。
Technosaurus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.