在bash中,调用foo将在stdout上显示该命令的任何输出。
调用foo>output会将该命令的任何输出重定向到指定的文件(在本例中为“output”)。
是否有方法将输出重定向到文件并将其显示在stdout上?
在bash中,调用foo将在stdout上显示该命令的任何输出。
调用foo>output会将该命令的任何输出重定向到指定的文件(在本例中为“output”)。
是否有方法将输出重定向到文件并将其显示在stdout上?
当前回答
在我的例子中,我有一个带有输出日志的Java进程。显示输出日志并将其重定向到文件(此处命名为logfile)的最简单解决方案是:
my_java_process_run_script.sh |& tee logfile
结果是Java进程正在运行,输出日志显示和将它们放入名为logfile的文件中
其他回答
在我的例子中,我有一个带有输出日志的Java进程。显示输出日志并将其重定向到文件(此处命名为logfile)的最简单解决方案是:
my_java_process_run_script.sh |& tee logfile
结果是Java进程正在运行,输出日志显示和将它们放入名为logfile的文件中
您可以通过在脚本开头使用类似的方法对整个脚本执行此操作:
#!/usr/bin/env bash
test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; }
# do whaetever you want
这会将stderr和stdout输出重定向到名为mylogfile的文件,并让所有内容同时到达stdout。
它被使用了一些愚蠢的技巧:
在没有命令的情况下使用exec来设置重定向,使用tee复制输出,使用所需的重定向重新启动脚本,使用特殊的第一个参数($'string'特殊bash符号指定的简单NUL字符)来指定重新启动脚本(原始工作可能不会使用等效的参数),使用pipefail选项重新启动脚本时,请尝试保持原始退出状态。
丑陋,但在某些情况下对我有用。
tee是完美的,但这也能完成任务
ls -lr / > output | cat output
使用tail-f输出应该有效。
要添加的内容。。。
在fedora和redhat unix版本下,软件包的非缓冲区对某些软件包存在支持问题。
抛开烦恼
跟踪对我有用
bash myscript.sh 2>&1 | tee output.log
谢谢ScDF和matthew,您的输入为我节省了大量时间。。