在我的bash脚本中,我尝试使用以下命令在另一个终端窗口中运行进程:
xterm -e /home/mohit/a.out
现在我想使用tee
命令重定向输出,如下所示:
xterm -e /home/mohit/a.out 2>&1 | tee logfile
但我在logfile
没有得到任何东西。任何线索,为什么会发生这种情况?
答案 0 :(得分:4)
看起来xterm会生成一个新窗口并在该窗口中执行-e。一旦该命令完成就退出。
因为它是在一个新的shell中打开的,所以它的stderr stdout等附加到那个窗口。
如果你想要的是打开那个窗口并保持打开日志文件你需要引用你想要由xterm执行的所有内容,否则bash将解释重定向和管道本身。例如
xterm -e /home/mohit/a.out 2>&1 | tee logfile
将由bash翻译成:
使用xterm执行命令/home/mohit/a.out 然后将stderr重定向到stdout并管道进入tee。
由于xterm会产生新的stdout等新窗口,因此tee没有得到任何输入,因此在logfile中没有任何内容
尝试
xterm -e '/home/mohit/a.out 2>&1 | tee logfile'
将强制xterm执行整个pipeling
答案 1 :(得分:1)
@peteches已经展示了如何通过将整个命令行提供给-e
来捕获输出。
您还可以要求xterm
使用-l
xterm -l -e /home/mohit/a.out
会记录到名为XtermLog.XXXXXX
或Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
您可以使用-lf
xterm -l -lf logfile -e /home/mohit/a.out
缺点是,这不适用于现有文件。在xterm将使用它之前,您必须删除logfile
。