在 Linux 上使用 Bash 将所有输出重定向到文件? [复制]
Posted
技术标签:
【中文标题】在 Linux 上使用 Bash 将所有输出重定向到文件? [复制]【英文标题】:Redirect all output to file using Bash on Linux? [duplicate] 【发布时间】:2013-05-26 08:57:59 【问题描述】:我正在尝试将命令行程序的所有输出重定向到文件。我正在使用 Bash。一些输出被定向到文件,但一些仍然出现在终端中并且没有存储到文件中。
此处描述了类似的症状:
Redirect all output to file
但是我尝试了建议的解决方案(捕获标准错误)但没有成功:
<cmd> <args> > stdout.txt 2> stderr.txt
stderr.txt 文件已创建但为空。
一个可能的线索是命令行程序是一个客户端与同一台机器上的服务器通信。可能某些输出来自服务器。
有没有办法从终端捕获所有输出,无论其来源如何?
编辑:
我已确认缺少的输出是由服务器生成的。在单独的终端中运行命令会在两个终端中产生一些输出,我可以将命令终端的所有输出通过管道传输到文件中。这引发了有关如何捕获服务器输出的问题,但这是一个不同的问题。
【问题讨论】:
服务器如何在不通过客户端的情况下写入您的终端?你能更具体地说明命令是什么吗?你所拥有的应该可以正常工作。 如果程序直接写入例如/dev/tty
,而不是标准输出流之一,没有(简单的)方法可以捕获它。还有一种可能是它可能将 stdout/stderr 文件描述符复制到另一个文件描述符并在那里写入,您可以捕获它(例如... 3> somefile
),但您必须知道正在使用什么文件描述符......
【参考方案1】:
您可以使用此语法将所有输出 stderr 和 stdout 重定向到 stdout.txt
<cmd> <args> > allout.txt 2>&1
【讨论】:
这种幼稚的方法只会捕获标准输入和标准输出。可能还有其他人。例如密码提示。因此,选择的答案更正确。不过我不会对你投反对票:) 我认为重要的是要补充一点,这一切都与I/O Redirection in BASH的广泛主题有关 对于这个解决方案,重定向的顺序也很重要。首先执行 2>&1 似乎不起作用。【参考方案2】:虽然不是 POSIX,但 bash 4 有 &>
运算符:
command &> alloutput.txt
【讨论】:
完全不知道这个。最后是一个简单的解决方案,它不仅仅重定向一个日志级别,而是全部! 这个可以和管道一起使用吗? 对我有用的最快修复,我需要做的就是添加 & 符号 这是最好的答案。【参考方案3】:如果服务器在同一个终端上启动,那么可能是服务器的 stderr 被写入终端并且您没有捕获它。
捕捉一切的最佳方式是运行:
script output.txt
在启动服务器或客户端之前。这将启动一个新的 shell,所有终端输出都重定向到 output.txt 以及终端。然后从该新外壳中启动服务器,然后启动客户端。您在屏幕上看到的所有内容(您的输入和从该 shell 中写入终端的所有内容的输出)都将写入文件。
完成后,键入“exit”退出由script
命令运行的shell。
【讨论】:
@yanbellavance 通常,表明这一点的方法是简单地支持您喜欢的答案。 Downvoting 只应该用于根本没有帮助的答案。此外,对于这个问题,linuxcdeveloper 的答案(linuxcdeveloper 是回答的人,Urda 刚刚编辑了答案)实际上并没有起作用,因为 Stefan 的问题是输出来自两个不同的进程;使用“脚本”是捕获会话所有输出的最佳方式,无论它来自哪个进程。 在这里,“脚本”是回答 OP 特定问题的最佳方式。它会真正捕获一切!【参考方案4】:您可以执行子shell并重定向所有输出,同时仍将进程置于后台:
( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
【讨论】:
【参考方案5】:我遇到了崩溃程序的问题 *cough php cough* 崩溃时,运行它的 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
【讨论】:
大声笑,因为*cough PHP cough*
而投了赞成票【参考方案6】:
正确答案在这里:http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html
your_command | ssh username@server "cat > filename.txt"
【讨论】:
以上是关于在 Linux 上使用 Bash 将所有输出重定向到文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章