我通常使用
./aaa.sh 2>&1 | tee -a log
但发现了一个似乎更简单的新命令:
./aaa.sh &> log
那么在第二种情况下我要放弃什么呢?
答案1
苹果和橙子。但首先...
就2>&1
vs而言&>
,他们都充当指挥标准错误到同一个地方标准输出正在被引导至。
但是您将放弃第二个的可移植性,因为它不符合 POSIX 标准,并且使用它的任何脚本只能与支持它的 shell 一起使用。
话虽如此,正如 Bash 手册页中所描述的那样,它们“在语义上是等效的”......
重定向标准输出和标准错误有两种格式:
&>word and >&word
在这两种形式中,优选第一种。这在语义上等价于
>word 2>&1
使用第二种形式时,单词可能不会扩展为数字或 -。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。
然而,还有更多的事情要做。您还使用了tee
为第一个版本添加附加功能的命令。它将采取其标准输入输入并将其定向到两个不同的地方:标准输出(如果您以交互方式运行此命令,通常是您的屏幕/终端)以及包含数据的指定文件附加的到它(-a
说追加而不是覆盖)。
将此与第二个版本进行比较,其中组合标准输出和标准错误覆盖log
文件并且不会显示在您的屏幕/终端上。
结论:正如一开始提到的,这实际上是两个不同的命令,但是,延伸等价的概念,一般来说第一个版本更优越,因为它是便携式的和aaa.sh
即使它被保存到文件中, 您也可以看到输出。当然,如果您不想看到它或者您想删除以前的文件内容,那就另当别论了。苹果和橙子。
答案2
两件事情:
tee
将其输入打印到指定文件中,和标准输出,实际上到您的终端。像>
or 这样的直接重定向&>
只会导致文件被写入。tee -a
追加对于指定的文件,a>
或&>
重定向会覆盖它。使用>>
or&>>
或>> file 2>&1
附加重定向。