可能的重复:
在屏幕上仅显示 stderr,但将 stdout 和 stderr 写入文件
使用 script 命令进行 stdout 、 stderr 和日志记录
猫测试.sh:
rm -v foo.tmp
date
pwd
猫测试2.sh:
script bar.log -c './test.sh'
执行 test2.sh 时,我希望在终端上看到以下内容:
Fri Feb 17 18:04:30 PST 2012
/home/me/me
但是在 bar.log 中我想看到:
removed 'foo.tmp'
Fri Feb 17 18:04:30 PST 2012
/home/me/me
或(如果 foo.tmp 不存在)
rm: cannot remove 'foo.tmp'
Fri Feb 17 18:04:30 PST 2012
/home/me/me
这可行吗?
答案1
这很难直接完成,因为script
会收集临时终端上的所有输出,并在该终端上显示其自己的标准输出。
在 中test.sh
,您需要有某种方法来区分您想要在终端上显示的消息与您只想在转录本中显示的消息。例如,向每行添加前缀以指示其重要性级别。由于示例中的其他行不以 开头@
,因此我将在非必要(仅转录本)行前添加前缀@
。
rm -v foo.tmp | sed 's/^/@/'
date
pwd
在包装脚本中:
script bar.log -c './test.sh | grep -v "^@"'
我认为如果不修改该实用程序,您无法做得更好script
。 (如果你想走这条路,我认为最简单的方法将涉及几行expect
。)