将 stdout 和 stderr 重定向到文件的 POSIX 兼容方法

将 stdout 和 stderr 重定向到文件的 POSIX 兼容方法

我正在尝试编写一个兼容 POSIX 的脚本,因此它可以在任何 *nix 系统(Debian、Fedora、CentOS、AIX、Arch...所有这些)上运行。当谈到重定向时,我对 POSIX 支持什么和不支持什么感到相当困惑。

如果我重定向ls -l file missingfile &> out.txt这在bash.stderr抱怨不存在的行missingfile和 , 输出的权限file都在out.txt.然而,我相信这只是有效的,因为这些 shell 支持的不仅仅是 POSIX 标准运算符。在研究这个问题时,我遇到了相互矛盾的答案。

这个堆栈交换答案例如,似乎暗示&>>&>>&&>>是非标准操作。然而,这个答案明确声明some-program > some_file 2>&1符合 POSIX 标准。这是否意味着>&运算符(使用stderr&的数字stdout)符合 POSIX 标准,而使用&>自动重定向stderrstdout到文件则符合POSIX 标准不是符合 POSIX 标准吗?或者两者都符合&>且不>&符合 POSIX 标准/符合 POSIX 标准(这两个人之一是错误的)?

我考虑过完全避免使用该&标志并使用ls -l file missingfile >out.txt 2>out.txt,但这有其自身的问题。以这种方式运行ls命令会导致 shell 打开 的两个文件句柄out.txt,都指向文件中的偏移量 0。因此,当ls查找这两个文件时,其中一个消息会被破坏。

人们期望ls -l file missingfile >out.txt 2>out.txt输出什么:

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
ls: cannot access 'missingfile': No such file or directory

实际输出是什么:

-rw-r--r-- 1 blah blah 0 Jun  3 13:18 file
le or directory

stdout以 POSIX 兼容方式将和重定向stderr到文件的最佳方法是什么?

答案1

您可以检查POSIX规范。这种语言并不总是容易理解,但如果您知道自己在寻找什么,您就可以看到它是否存在。

POSIX 包括重定向操作,其中N>&wordN<&word是可选的文件描述符编号(默认为 0 表示输入,1 表示输出)并且单词可:

  • 数字序列,用于重定向文件描述符任何已经开放的内容单词
  • 字符-, 关闭文件描述符

>out.txt 2>&1将标准输出和标准错误重定向到 POSIX 兼容的方法也是如此out.txt。它也适用于 POSIX 之前的版本伯恩炮弹

>& 后跟文件名是某些 shell(包括 bash)中的扩展,它将 stdout 和 stderr 重定向到该文件。

&>>&是bash(和 zsh)中后跟文件名的同义词。它的优点是即使文件名是数字序列或也能工作-(例如foo >&"$a",相当于foo 1>&3 2>&1if 的值为adigital 3,但相当于foo >myfile 2>&1if 的值为ais myfile)。它的缺点是与 POSIX 不兼容。在兼容 POSIX 的 shell 中,echo foo &>bar被解析为命令echo foo&运算符和命令>bar:打印的后台进程foo和创建或清空文件的前台进程bar

相关内容