gpt4 book ai didi

shell - 是将 stderr 重定向到 stdout 还是将两者重定向到同一个文件?

转载 作者:行者123 更新时间:2023-12-05 04:03:03 26 4
gpt4 key购买 nike

哪个更好?

  • cmd >>文件 2>&1
  • cmd 1>>文件2>>文件

有区别吗?


我知道选择第一个的两个原因:它也适用于 > 而不是 >>。它更受欢迎,因此了解 shell 脚本的人会立即排除它。

但是,我仍然觉得第二个可读性更好,并且无需了解 [n]>&[n] 语法即可工作,恕我直言,这有点令人困惑。

最佳答案

有什么区别?

让我们看看每个命令的含义。我会假设 POSIX shell specification适用,因为该问题没有询问任何更具体的问题。

第一个命令是cmd >>file 2>&1。这会在设置指定的重定向后运行 cmd

重定向>>file使用 O_APPEND 打开命名文件。正如 open 的规范中所解释的那样, 这会创建一个新的 Open File Description ,其中特别包含当前文件偏移量,并安排 File Descriptor 1 引用该描述。 O_APPEND的含义是“在每次写入之前,文件偏移量应设置为文件末尾”。

重定向2>&1说文件描述符 2“应该成为文件描述符 1 的副本”。该规范有点模糊,但我认为唯一明智的解释(以及 shell 实际所做的)是调用 dup2(1, 2) 的意思。 ,这“将导致文件描述符 [2] 引用与文件描述符 [1] 相同的打开文件描述”。至关重要的是,我们得到了另一个文件描述符,但继续使用相同的文件描述,这意味着它们都具有相同的文件偏移量。

第二个命令是cmd 1>>file 2>>file。根据上面引用的规范,这为 file 创建了两个单独的文件描述,每个都有自己的偏移量。

现在,如果 cmd 对文件描述符 1 和 2 做的唯一事情是调用 write ,那么这两种情况是等价的,因为每次调用write都会在执行写入之前自动更新偏移量以指向文件末尾,因此存在第二个命令中的两个单独的偏移量不会产生任何可观察到的效果。

但是,如果 cmd 执行一些其他操作,例如 lseek ,那么这两种情况不等价,因为这将表明第一个命令有一个共享偏移量,而第二个命令有两个独立的偏移量。

此外,上面假定 O_APPEND 的 POSIX 指定语义。但是真正的计算机系统并不总是实现这一点;例如,NFS does not have atomic append .如果没有原子追加,即使仅执行 write,第二个命令的行为也可能不同(很可能会破坏输出)。

哪个更好?

由于这两个命令的意思不同,所以哪个更好大概取决于哪个意思更接近您的意图。我推测,在几乎所有情况下,目的是将 cmd 的标准输出和标准错误都附加到 file,这被假定为仅 write 到这些描述符。这正是第一个命令 (cmd >>file 2>&1) 的含义,因此是更好的选择。

虽然第二个命令确实使用了较少的 shell 功能,因此对于某些人来说可能更容易理解,但对于那些确实更熟悉重定向语法的人来说,这可能看起来很奇怪,甚至可能在某些情况下表现出与预期不同的行为。因此我会反对它,如果我在我维护的某些代码中发现它,我会倾向于将它更改为第一种形式。

当然,如果您真的想要单独的文件描述,并因此需要单独的文件偏移量,那么第二个命令是有意义的,只要您在附近添加注释以解释不寻常构造的基本原理。

关于shell - 是将 stderr 重定向到 stdout 还是将两者重定向到同一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53893055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com