You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在nohup执行的多命令bash脚本中向stdout发送指定消息?

解决nohup执行多命令时向终端输出特定消息的问题

nohup默认会把进程的stdout和stderr重定向到nohup.out,你之前的写法(把echo转到stderr再整体重定向回stdout)会让所有输出都进入nohup.out,达不到预期效果。下面提供两种可行的解决办法:

方法一:直接输出到控制终端/dev/tty

/dev/tty是当前进程的控制终端设备文件,不管nohup如何重定向进程输出流,直接向这个文件写入内容就能显示在终端上。示例代码:

nohup sh -c " \
echo 'some message 1' > /dev/tty && \
some_command_1 && \
echo 'some message 2' > /dev/tty && \
some_command_2 && \
..." &
  • some_command_1、some_command_2的输出依然会被nohup重定向到nohup.out,符合你的需求;
  • echo的内容直接输出到当前终端,不会进入nohup.out。

方法二:保存原终端的文件描述符

在启动shell时先把原终端的stdout保存到一个备用文件描述符(比如3),需要输出消息时定向到这个描述符即可:

nohup sh -c " \
# 把原终端的stdout保存到fd 3
exec 3>/dev/tty && \
echo 'some message 1' >&3 && \
some_command_1 && \
echo 'some message 2' >&3 && \
some_command_2 && \
# 用完关闭备用fd
exec 3>&- \
" &

这种方法和方法一本质类似,只是通过文件描述符操作实现,适合需要多次复用终端输出的场景。

补充说明

你之前的写法存在两个错误:

  1. echo ... >$2是语法错误,正确的stderr重定向写法是>&2;
  2. 结尾的2>&1会把整个sh进程的stderr合并到stdout,而nohup已经将stdout重定向到nohup.out,所以即使echo输出到stderr,最终还是会进入nohup.out,这就是你的方法未生效的原因。

内容的提问来源于stack exchange,提问作者HatteSoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:06:20