我正在尝试制作一个演示虚拟机。在桌面上,我有一个脚本foo.sh
,它将 stdout 输出到foo.log
(例如使用some command > foo.log
)
当我双击脚本时,它会生成 foo.log。但是,我希望脚本也能实时显示标准输出(例如使用tail -f foo.log
)。
我该怎么做?我需要将输出传输到两个地方吗?
答案1
这可能不是最优雅的方法,但它似乎有效:
将以下内容添加到脚本中:
touch foo.log
uxterm -e "tail -f foo.log" &
some command > foo.log
使用 gnome-terminal,替换uxterm -e
为gnome-terminal -x
。
感谢山顶约德尔歌手为我指明这个解决方案。
答案2
Unix 的标准tee
命令允许你将命令的标准输入重定向到一个或多个文件,并将其打印到标准输出。因此,你可以执行以下操作
myscript.sh|tee mylog.log
假设 myscript.sh 只是打印到标准输出(这实际上会简化它)
要在单击图标时打开终端窗口,您可以将其包装在另一个脚本中:
xterm -e "myscript.sh | tee mylog.log; read -p FINISHED"
您的解决方案的不同之处在于,您可以选择在脚本完成时关闭终端窗口或显示“按任意键继续......”消息 - 终端tail -f
基本上无法知道脚本何时完成,因此您必须使用 Ctrl-C 来中断它。
此外,tail -f 的效率肯定不如直接打印到终端,但这在当今可能并不那么重要。
答案3
我按照 Sergy 的建议做了,如果有效,那可能是路径问题。下面是我使用的确切命令,结果是 xterm 打开,显示脚本的输出,然后显示“按回车键关闭”。我建议您在脚本名称前面添加路径,并可能添加日志文件名。
xterm -e "./myscript.sh | tee ./mylog.log; read -p Press\ return\ to\ close\ "
我的版本myscript.sh
所做的只是回应几行,但它有效。