【问题标题】:Why does ditto send errors to stdout and output to stderr?为什么同上将错误发送到标准输出并输出到标准错误?
【发布时间】:2010-07-02 03:50:53
【问题描述】:

也许我遗漏了一些东西,但是当我输入一个冗长的同上命令 (ditto [-v] [-V] 2>>some.log) 时,它会将常规输出发送到 stderr。因此,我的some.log 文件将填充copying file ... 之类的条目。

这对我来说没有逻辑意义,但这也是手册所说的:

-V            Print a line of output to stderr for every file, symbolic
              link, and device copied.

我尚未对此进行验证,但我假设实际的 I/O 错误已发送到 stdout。我最初想要的是显示常规输出,但记录所有错误。所以假设错误被发送到stdout,那么这个问题并不是什么大问题——只是语义对我来说没有意义。

所以,这应该给我正确的输出:

ditto -V /some/path/ /some/other/path 1>>some.log

【问题讨论】:

  • 属于 superuser.com

标签: bash macos


【解决方案1】:

实际上,ditto 将错误消息和详细状态消息都发送到 stderr。原因是如果它处于-c(创建存档)模式,并且目标文件被指定为-,它会将存档写入stdout。将状态消息与存档混合会非常非常糟糕。顺便说一句,tar -v 做同样的事情,出于同样的原因。

【讨论】:

  • 我之前试过这个:ditto -V /some/path/ /some/other/path 2>>some.log 并且在我的终端中我得到输出说:I/O 错误 [...],但是在我的日志中,我得到了所有的复制等。所以获取错误日志的最佳方法是什么 - 有可能吗?
  • 当我尝试使用 ditto 复制我没有读取权限的文件时,它会将错误打印到 stderr。您确定 I/O 错误消息来自 ditto
  • 也许不是?我只是在删除读取访问权限后尝试过,它被转到了stderr;但是,我之前在硬盘驱动器损坏的系统上尝试此操作,并将 I/O 错误打印到标准输出(可能不是同上)。