Bow*_*ark 4 bash files background-process
从后台的 bash shell 启动程序的命令,比如 evince 是
evince &
Run Code Online (Sandbox Code Playgroud)
但是如果我想在后台打开一些带有 evince 的文件怎么办?也evince myfile.pdf &没有evince & myfile.pdf按预期工作:第一个输出类似于[2] 5356
但在下一行 shell 返回锁定;第二个打开了一个空洞的 evince。
那么,我可以使用什么语法?
evince myfile.pdf
Run Code Online (Sandbox Code Playgroud)
bg
Run Code Online (Sandbox Code Playgroud)
这将打开程序,挂起它,然后将其置于后台。
或者:
( evince myfile.pdf ) &
Run Code Online (Sandbox Code Playgroud)
将evince在 a(subshell)和背景中打开(subshell). 简单地说,这有点奇怪:
evince myfile.pdf &
Run Code Online (Sandbox Code Playgroud)
但不起作用,因为它对我有用。
你可能想要:
echo $-
Run Code Online (Sandbox Code Playgroud)
并检查您的作业控制参数。我建议:
set -b
Run Code Online (Sandbox Code Playgroud)
如果您还没有使用它。做:
man set
Run Code Online (Sandbox Code Playgroud)
了解更多信息。或者在这里查看我的其他答案。
有时,当您启动程序时,它会打印出一些消息。如果您在后台启动它,程序可能会锁定,直到您将其返回前台以便它可以显示其消息。解决方案是重定向stdout和stderr,以便程序可以继续在后台运行。一种方法是:
evince myfile.pdf >~/evince.errs 2>&1 &
Run Code Online (Sandbox Code Playgroud)
上面的代码在您的主目录中创建了一个文件,其中包含evince想要显示的任何消息。
如果您确信 evince 的消息不重要,您可以丢弃它们而不创建文件:
evince myfile.pdf >/dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)
运行上述任一命令后,shell 应该生成类似的消息[1] 1234,然后出现 shell 提示符。正如 Graeme 所建议的,如果 shell 提示符没有出现,请尝试再次按 Enter 键。