&>>&和2>&1之间的重定向差异


Answers:


7

既然您已标记zsh,那么让我告诉您,所有3个重定向的工作方式都完全相同。正如您可能已经阅读了两个重复的帖子(评论中的一个和您的帖子中的一个)一样,它们全部都重定向stderrstdout该目录,而又将其重定向到文件“ logfile”(即,日志文件将同时包含输出和错误) )。

但是它们的行为会根据您所使用的外壳而改变很多。

重定向的三种样式都可以在bash和中以相同的方式很好地工作zsh

但:

>&适用于cshtcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

ksh仅在2>&1作品中。

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

我讨厌ksh。虽然>&只是给出了一个错误,但&>后台命令的一部分并清空了日志文件(如果非空的话)。


1
那你的意思是sh?如果它的POSIX外壳,&>并且>&将无法正常工作。
cuonglm 2014年

遗憾的是,第一句话实际上是不正确的。请参阅我的答案,以获取内容与附加内容。
汤姆·黑尔

1

&>>&半等效性(口语)

zsh手册重定向节说:

  • &>
  • >&

是等效的。

两者都会破坏文件-将文件截断为0个字节,然后再写入文件,就像仅> file使用STDIN的情况一样。

但是bash手动重定向部分添加了以下内容:

在两种形式中,第一种是优选的。这在语义上等同于

>word 2>&1

使用第二种形式时,单词可能不会扩展为数字或-。如果是这样,出于兼容性原因,将应用其他重定向操作符(请参阅下面的“复制文件描述符”)。

因此,当您标记时zsh,如果有人编写bash脚本,最好以第一种形式获得手指记忆。

>> logfile 2>&1&>>等价(附加)

在这里,logfile不会被覆盖,而是在文件末尾打开以进行写入,即追加模式(O_APPEND)。

两者的等效项{ba,z}sh是:

command1 &>> logfile

bash

附加标准输出和标准错误的格式为:

&>>word

这在语义上等同于

>>word 2>&1

(请参见下面的复制文件描述符)。

(注意:鉴于只有一种附加方式,建议再次使用以上部分中的&>over >&来代替bash。)

zsh允许&>>>>&形式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.