我正在尝试将命令输出同时发送到文件和控制台。因为我想在文件中保留输出记录。我正在执行以下操作,它会将输出附加到文件中,但不会在终端中打印ls
的输出。
$ls 2>&1 > /tmp/ls.txt
是的,如果你将输出重定向,它就不会出现在控制台上。使用tee
命令。
ls 2>&1 | tee /tmp/ls.txt
值得一提的是,2>&1 表示标准错误输出将与标准输出一起被重定向。因此,
someCommand | tee someFile
这仅会将标准输出写入文件,但不包括标准错误输出:标准错误输出只会在控制台显示。如果您想要将标准错误输出也写入文件中,可以使用
someCommand 2>&1 | tee someFile
(来源: 在shell中,“2>&1”是什么? )。最后,这两个命令都会截断文件并清空它。如果您使用一系列命令,则可能希望一个接一个地获取所有命令的输出和错误。在这种情况下,您可以使用-a标志来执行“tee”命令:
someCommand 2>&1 | tee -a someFile
如果有人需要追加输出而不是覆盖原有内容,可以使用"tee"命令的"-a"或"--append"选项:
ls 2>&1 | tee -a /tmp/ls.txt
ls 2>&1 | tee --append /tmp/ls.txt
2>&1
),因此消耗管道的下一个进程将把它们两个都视为常规输入(简而言之:是的)。 - Karoly Horvathls
的退出状态。如果您想保留ls
的退出状态,或者更准确地说,如果您想确定管道中的某些内容失败了,尽管tee
是管道中的最后一个(也很可能是成功的)命令,您需要使用set -o pipefail
。 - Christian Hujer