首先; 一旦启动了流程,就可以通过先使其停止(命中Ctrl- Z),然后键入bg
使其在后台继续运行来使其成为后台。它现在是一个“工作”,而其stdout
/ stderr
/ stdin
仍然连接到你的终端。
您可以通过在其末尾添加“&”来立即启动一个后台进程:
firefox &
要在静默的背景下运行它,请使用以下命令:
firefox </dev/null &>/dev/null &
一些其他信息:
nohup
是一个程序,您可以使用它来运行您的应用程序,以便可以将其stdout / stderr发送到文件中,并且关闭父脚本不会导致子级升高。但是,在启动应用程序之前,您需要具有先见之明才能使用它。由于工作方式的原因nohup
,您不能仅将其应用于正在运行的进程。
disown
是一个bash内置函数,它从shell的作业列表中删除了一个shell作业。这基本上意味着您不能再使用fg
,bg
但是更重要的是,当您关闭外壳时,外壳将不再挂起或发送SIGHUP
给该孩子。不像nohup
,disown
使用后的进程已经启动,中背景。
您无法做的是在启动进程后更改其stdout / stderr / stdin。至少不是来自外壳。如果启动进程并告诉它其stdout是您的终端(默认情况下就是您要做的事情),则该进程将配置为输出到您的终端。您的外壳与流程的FD设置无关,这完全是流程本身管理的事情。进程本身可以决定是否关闭其stdout / stderr / stdin,但是您不能使用shell强制这样做。
要管理后台进程的输出,您可以从脚本中选择很多选项,“ nohup”可能是第一个想到的选项。但是对于交互过程,您开始却忘了静音(firefox < /dev/null &>/dev/null &
),实际上您不能做很多事情。
我建议您使用GNU screen
。使用screen,您可以在进程输出变得麻烦时关闭运行中的shell,然后打开一个新的shell ^Ac
。
哦,顺便说一句,不要$@
在使用的地方使用“ ”。
$@
意味着$1
,$2
,$3
...,这将打开你的命令到:
gnome-terminal -e "vim $1" "$2" "$3" ...
那可能不是您想要的,因为-e只接受一个参数。使用$1
表明你的脚本只能处理一个参数。
要使多个参数在您给定的情况下(带有gnome-terminal -e
)确实很难工作,因为-e
仅接受一个参数,这是一个shell命令字符串。您必须将参数编码为一个。最好,最可靠但很笨拙的方式是这样的:
gnome-terminal -e "vim $(printf "%q " "$@")"