在Linux上使用Bash,如何将所有输出重定向到文件中?

145

我正在尝试将命令行程序的所有输出重定向到文件中。我正在使用Bash。一些输出被定向到该文件,但有一些仍然出现在终端并未存储到文件中。

类似的症状在这里描述:

将所有输出重定向到文件

然而,我尝试了所提议的解决方案(捕获stderr),但没有成功:

<cmd> <args> > stdout.txt 2> stderr.txt

文件stderr.txt已创建,但内容为空。

可能的线索是,命令行程序是一个客户端,与同一台机器上的服务器进行通信。可能部分输出来自服务器

是否有办法捕获终端的所有输出,不管它的来源是什么?

编辑:

我已确认缺失的输出是由服务器生成的。在单独的终端中运行该命令会导致两个终端都有一些输出,我可以将命令终端的所有输出传输到一个文件中。这引发了如何捕获服务器输出的问题,但这是另一个问题。


4
服务器如何在不通过客户端的情况下写入到你的终端?你能更具体地说明这个命令是什么吗?你现在的操作应该是可以正常工作的。 - Carl Norum
1
如果程序直接写入例如/dev/tty,而不是标准输出流之一,则没有(简单的)方法来捕获它。还有可能将stdout/stderr文件描述符复制到另一个文件描述符并在那里写入,您可以捕获它(例如... 3> somefile),但您必须知道正在使用哪个文件描述符... - twalberg
缺失/部分输出的实际问题可能是由于输出缓冲区。请参见此答案:https://dev59.com/nZzha4cB1Zd3GeqPKcu4#70209496 - Y00
6个回答

171

您可以使用此语法将所有输出stderr和stdout重定向到stdout.txt

<cmd> <args> > allout.txt 2>&1 

3
这种天真的方法只能捕获标准输入和标准输出,但它可能还有其他的,比如密码提示。因此,选择的答案更正确。不过我不会给你投反对票 :) - robert
我认为重要的是要补充说明,这一切都与BASH中的I/O重定向这个广泛的主题有关。 - Jake88
对于这个解决方案,重定向的顺序也很重要。首先执行2>&1似乎行不通。 - a1an
1
这可能是“天真的方法”,但当我在Ubuntu上尝试时,被接受的答案错过了关键的stderr输出。这个答案对我有用,所以它得到了我的天真赞成。 - KoZm0kNoT

161
尽管不符合POSIX,但bash 4具有&>运算符: command &> alloutput.txt

3
完全不知道这个。终于有一个简单的解决方案,不仅可以重定向一个日志级别,而且可以重定向所有日志级别! - Michele Federici
1
这个能和管道一起使用吗? - Paul
1
最快的解决方法是添加“&”符号,这对我来说就足够了。 - Christian Noel
这是最佳答案。 - codehearted
3
@Paul 是的,可以通过 command |& command 实现。 - BLuFeNiX

77
如果服务器在同一终端上启动,则可能将服务器的stderr写入终端并且你没有捕获它。 捕获所有内容的最佳方法是运行:
script output.txt

在启动服务器或客户端之前,请使用“script”命令启动一个新的Shell,并将所有终端输出重定向到“output.txt”文件和终端。然后在该新shell中启动服务器,然后启动客户端。您在屏幕上看到的所有内容(包括您的输入以及从该shell内部写入终端的所有内容)都将写入该文件。

完成后,键入“exit”以退出由“script”命令运行的Shell。


4
通常,表示偏好的方法是简单地给你喜欢的答案点赞。只有完全没有帮助的答案才应该被踩。此外,在这个问题中,linuxcdeveloper的答案(linuxcdeveloper是回答者,Urda只是编辑了答案)实际上并没有起作用,因为Stefan的问题是输出来自两个不同的进程;使用“script”是捕获会话所有输出的最佳方法,无论来自哪个进程。 - Brian Campbell
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - robert
1
请返回翻译后的文本:或者 script -c yourcommand output.txt - wolfrevo

7
我遇到了一个崩溃的程序 *cough PHP cough*。在崩溃时,运行该程序的shell会报告崩溃原因,Segmentation fault (core dumped)
为了避免这种输出没有被记录下来,可以在子shell中运行命令,并能够捕获和重定向这种输出:
sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1

3
谢谢您的投票,因为“咳咳 PHP 咳咳”。 - Aaron Esau

6
您可以执行一个子shell并重定向所有输出,同时仍将进程放在后台:
( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接