当使用具有作业控制功能的 shell 时,每个管道通常被放入其自己的进程组中。
当从交互式程序(例如编辑器)生成子进程时,子进程通常会与编辑器位于同一进程组中。这意味着当编辑器进入后台时,子进程也会停止。
如果子进程本身就是一个图形程序,例如 PDF 查看器,则这是不希望的okular
。
在这种情况下调用的正确策略是(使用vi
语法)
:!set -m;okular %.pdf&
即,在将查看器作为后台进程调用之前强制子 shell 启用(作业)监视器选项? (子 shell 在由 调用时不是交互式的system()
,因此默认情况下监视选项处于关闭状态。)
答案1
是的,set -m
是一种方式。我想不出一种需要更少打字的方法(无需事先准备)。
在 Linux 上,另一种方法是在命令前面加上setsid
.它不仅在单独的进程组中运行该命令,而且还在单独的会话中运行该命令,在这种情况下这不太重要。打字量相同,但标点符号更少,因此可能更方便。
另一种方法是运行中间交互式 shell。不过打字还是挺别扭的。
setsid okular %.pdf&
set -m;okular %.pdf&
sh -ic 'okular %.pdf'&