Bash的手册页提到了重定向stderr和stdout的两种方法:
&> file
和>& file
。现在,请注意它同时显示stderr和stdout。
在这种情况下,>file 2>&1
我们正在将stdout(1)重定向到文件,然后还要告诉stderr(2)重定向到与stdout相同的位置!因此目的可能是相同的,但想法略有不同。换句话说,“约翰,去上学;苏奇去约翰去的地方”。
那么偏好呢?&>
是一bash
件事。因此,如果要移植脚本,则不会这样做。但是,如果您100%确定您的脚本只能在具有bash的系统上运行-那么就没有偏好了
这是dash
Debian Amquist Shell 的示例,这是Ubuntu的默认设置。
$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory
如您所见,stderr没有被重定向
要解决问题中的修改,可以使用if语句检查$ SHELL变量并相应地更改重定向
但在大多数情况下> file 2>&1
应该可以工作
用更专业的术语来说,该格式[integer]>&word
称为Duplicating Output File Descriptor,是POSIX Shell命令语言标准指定的功能,大多数POSIX兼容外壳和类似Brourne的外壳都支持该功能。
另请参见输出重定向中的确切含义是什么?