我有一堆可执行文件,我想将每个文件的输出存储在一个单独的文件中。
为此目的,我使用以下命令,但"2>&1"
每次都不起作用。有时候输出文件仍然是空的,即使从shell运行时脚本会在shell中打印东西。
我应该使用什么而不是2>&1
?
./$file 2>&1 | tee "$outputFile"
答案 0 :(得分:3)
有些可执行文件不只是写入stdout和stderr,而是打开/ dev / tty并写入。
因此,为了重定向那些,有必要做一个涉及伪的tty的更复杂的过程。有关可以执行此操作的内容,请参阅命令script
。
答案 1 :(得分:2)
如果要同时捕获stdout和stderr:
./$file > $outputfile 2>&1
但是,某些程序是智能的,并检测其输出被重定向到哪种类型的终端。如果将它发送到文件,它们可能会生成不同的输出...
答案 2 :(得分:2)
只是详细说明Darron的答案,您可以使用script
命令捕获所有输出。这是一个使用python脚本写入stdout,stderr和/ dev / tty的示例,并捕获所有三个输出:
brent@battlecruiser:~$ cat test.py
import sys
sys.stdout.write('o\n')
sys.stderr.write('e\n')
with open('/dev/tty', 'w') as tty:
tty.write('t\n')
brent@battlecruiser:~$ script testout
Script started, file is testout
brent@battlecruiser:~$ python test.py
o
e
t
brent@battlecruiser:~$ exit
Script done, file is testout
brent@battlecruiser:~$ head -n -3 testout | tail -n +3
o
e
t
将此与使用2>1&
和tee
:
brent@battlecruiser:~$ python test.py 2>&1 | tee testout
e
t
o
brent@battlecruiser:~$ cat testout
e
o
如您所见,未捕获对/dev/tty
的写入。尝试在script
命令中执行命令,如图所示,看看它是否捕获了所有结果。