命令输出重定向到文件和终端

Sat*_*ish 59 linux bash redirect

我正在尝试将命令输出抛出到文件加控制台.这是因为我想保留文件中的输出记录.我正在做跟随,它附加到文件但不在ls终端上打印输出.

$ls 2>&1 > /tmp/ls.txt
Run Code Online (Sandbox Code Playgroud)

Kar*_*ath 95

是的,如果您重定向输出,它将不会出现在控制台上.使用tee.

ls 2>&1 | tee /tmp/ls.txt
Run Code Online (Sandbox Code Playgroud)

  • 没关系,我找到了--append,-a (6认同)
  • 在这种情况下,错误被合并到输出("2>&1")中,因此使用管道的下一个进程将看到它们都是常规输入(简而言之:是). (2认同)
  • 如何在上述命令中给出 ls.txt 文件的大小,使其不超过给定的大小。一旦超过最大大小,如何在同一目录中创建新文件(例如:ls1.txt,ls2.txt ...) (2认同)
  • 请注意,您将失去"ls"的退出状态.如果你想保留`ls`的退出状态,或者更确切地想要弄清楚管道中的某些东西是否失败,尽管`tee`是你管道中的最后一个(也很可能是成功的)命令,你需要使用`set -o pipefail`. (2认同)

Ser*_*tch 26

值得一提的是,2>&1意味着标准错误也将被重定向,与标准输出一起.所以

someCommand | tee someFile
Run Code Online (Sandbox Code Playgroud)

为您提供文件中的标准输出,但不是标准错误:标准错误仅出现在控制台中.要在文件中获得标准错误,您也可以使用

someCommand 2>&1 | tee someFile
Run Code Online (Sandbox Code Playgroud)

(来源:在shell中,什么是"2>&1"?).最后,上述两个命令都将截断文件并开始清除.如果使用一系列命令,您可能希望一个接一个地获得所有命令的输出和错误.在这种情况下,您可以使用-a标志来"tee"命令:

someCommand 2>&1 | tee -a someFile
Run Code Online (Sandbox Code Playgroud)


Far*_*rah 12

如果有人需要附加输出而不是覆盖,可以使用"tee"命令的"-a"或"--append"选项:

ls 2>&1 | tee -a /tmp/ls.txt
ls 2>&1 | tee --append /tmp/ls.txt
Run Code Online (Sandbox Code Playgroud)