我正在尝试编写一个兼容 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 标准,而使用&>
自动重定向stderr
和stdout
到文件则符合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>&word
N<&word
氮是可选的文件描述符编号(默认为 0 表示输入,1 表示输出)并且单词可:
- 数字序列,用于重定向文件描述符氮任何已经开放的内容单词。
- 字符
-
, 关闭文件描述符氮。
>out.txt 2>&1
将标准输出和标准错误重定向到 POSIX 兼容的方法也是如此out.txt
。它也适用于 POSIX 之前的版本伯恩炮弹。
>&
后跟文件名是某些 shell(包括 bash)中的扩展,它将 stdout 和 stderr 重定向到该文件。
&>
>&
是bash(和 zsh)中后跟文件名的同义词。它的优点是即使文件名是数字序列或也能工作-
(例如foo >&"$a"
,相当于foo 1>&3 2>&1
if 的值为a
digital 3
,但相当于foo >myfile 2>&1
if 的值为a
is myfile
)。它的缺点是与 POSIX 不兼容。在兼容 POSIX 的 shell 中,echo foo &>bar
被解析为命令echo foo
、&
运算符和命令>bar
:打印的后台进程foo
和创建或清空文件的前台进程bar
。