118

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

此处描述了类似的症状:

将所有输出重定向到文件

但是我尝试了建议的解决方案(捕获标准错误)但没有成功:

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

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

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

有没有办法从终端捕获所有输出,无论其来源如何?

编辑:

我已经确认缺少的输出是由服务器生成的。在单独的终端中运行命令会在两个终端中产生一些输出,我可以将命令终端的所有输出通过管道传输到文件中。这引发了有关如何捕获服务器输出的问题,但这是一个不同的问题。

4

6 回答 6

148

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

<cmd> <args> > allout.txt 2>&1 
于 2013-05-30T17:42:21.327 回答
125

虽然不是 POSIX,但 bash 4 有&>运算符:

command &> alloutput.txt

于 2016-04-23T07:10:58.503 回答
74

如果服务器在同一个终端上启动,那么可能是服务器的 stderr 被写入终端并且您没有捕获。

捕获所有内容的最佳方法是运行:

script output.txt

在启动服务器或客户端之前。这将启动一个新的 shell,所有终端输出都重定向到 output.txt 以及终端。然后从该新外壳中启动服务器,然后启动客户端。您在屏幕上看到的所有内容(您的输入和从该 shell 中写入终端的所有内容的输出)都将写入文件。

完成后,键入“exit”退出该script命令运行的 shell。

于 2013-05-30T17:20:46.417 回答
6

您可以执行子shell 并重定向所有输出,同时仍将进程置于后台:

( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
于 2015-12-16T17:39:32.280 回答
4

我遇到了崩溃程序的问题 *咳嗽PHP咳嗽* 崩溃时,它运行的 shell 报告了崩溃原因,Segmentation fault (core dumped)

为避免此输出未被记录,该命令可以在子shell 中运行,该子shell 将捕获并引导这些类型的输出:

sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1
于 2015-09-01T22:46:57.607 回答
2

正确的答案在这里:http ://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html

your_command | ssh username@server "cat > filename.txt"
于 2014-08-01T14:56:13.360 回答