Linux终端中如何完全抑制带&的后台进程的任务提示、程序输出与错误输出
问题核心逻辑拆解
你之前的操作没有完全抑制目标输出,本质是两个认知偏差:
- 你用
>/dev/null 2>&1重定向的内容,仅覆盖被启动程序本身的标准输出、标准错误流,Shell自身打印的[#] {PID}作业提示不属于被启动程序的输出,是交互式Shell的作业控制机制自动生成的内容,普通的流重定向完全作用不到这部分内容- 你写的命令拼接顺序存在语法偏差:
feh "image.jpg" & >/dev/null 2>&1的实际执行逻辑是,先把feh放到后台启动、立刻打印任务提示,后续的重定向规则是作用在当前Shell自身上,完全没有覆盖到feh进程的输出流,自然无法达到预期效果。
可实现完全抑制的操作方法
所有方法在Manjaro默认搭载的Bash、Zsh交互式Shell环境下均可正常生效:
- 方法1:临时关闭Shell作业状态通知,完成启动后恢复默认配置
执行单条命令即可完成全流程:set +m; feh "image.jpg" >/dev/null 2>&1 &; set -m
原理说明:Shell打印任务号、PID提示的行为,仅在作业控制机制开启(set -m为系统默认开启状态)时触发。临时关闭该机制后启动后台进程,Shell不会打印对应作业提示,执行完重新开启作业控制,不会影响后续Shell的正常交互体验。 - 方法2:通过独立会话启动进程,脱离当前Shell的作业管控范围
可使用setsid命令将进程放入新的独立会话启动,从根源上避免当前Shell为其打印作业提示:setsid feh "image.jpg" >/dev/null 2>&1 < /dev/null &
该方式启动的进程不属于当前Shell的作业列表,不仅不会触发Shell的提示输出,还能保证当前Shell退出时,后台启动的进程不会被系统自动终止。 - 方法3:通过子Shell执行后台启动操作,拦截Shell自身的提示输出
不需要修改当前Shell的全局配置,直接将启动逻辑放到子Shell内执行,把所有子Shell生成的提示一并重定向:(feh "image.jpg" >/dev/null 2>&1 &) >/dev/null
原理说明:子Shell在启动后台任务时生成的作业提示,会顺着子Shell的标准输出流被重定向到/dev/null,不会传递到当前交互的主Shell终端中。
内容的提问来源于stack exchange,提问作者Hussein Esmail
相关产品推荐
相关产品推荐

