Joe*_*Joe 5 linux bash command-line job-control
假设我已经使用 ctrl-z 对一个进程进行了后台处理,例如 VIM。然后我使用以下命令启动一个 xterm xterm &> /dev/null &
。如果我只是输入 disown 那么我将丢失我的 vim 进程。相反,我必须键入 xterm 进程的 PID 才能否认它。
有什么办法可以解决这个问题,或者是否有发生这种情况的原因?
你有几种方法可以做到:
随着%-
你会要求否认最后的后台工作。
xterm &> /dev/null & disown %-
Run Code Online (Sandbox Code Playgroud)随着$!
反而你会问断绝关系的最后执行的作业(通过其PID)。
xterm &> /dev/null & disown $!
Run Code Online (Sandbox Code Playgroud)所以它需要多写几个字符,但至少你可以选择哪些:-)
原因就在这里:当您执行一个使用 将其发送到后台的作业时&
,本质上它不会更改当前作业,而只会更改前一个作业。当前的工作仍然是以前的工作。
您可以使用命令检查上面所说的内容jobs
,比较其在后台启动作业前后的输出。
之前:让我们假设您有几个后台进程只是从终端运行(例如使用dolphin &
和启动kate &
)。
现在您开始vim
并使用 Ctrl-Z.
的输出jobs
将是:
[1] Running dolphin . &
[2]- Running kate &
[3]+ Stopped vim
Run Code Online (Sandbox Code Playgroud)
vim
是当前作业,标记为+
,kate
是前一个任务,标记为-
。
实际上,在 bash 参考手册中,第 7.1 [ 1 ]章中解释说
“在与作业有关的输出(例如,jobs 命令的输出)中,当前作业始终标记为 '+',而前一个作业标记为'-'。”
之后:最后你写你的命令xterm &> /dev/null &
(没有disown
)。
询问jobs
,这次它会回答:
[1] Running dolphin .
[2] Running kate
[3]+ Stopped vim
[4]- Running xterm &> /dev/null &
Run Code Online (Sandbox Code Playgroud)
请注意,vim
仍然用 a +
和xterm
a标记-
。
最后一个带有标记的后台作业-
是xterm
并且不再是kate &
。
换句话说,系统就像
xterm
:新命令 ( xterm
) 成为当前命令和vim
前一个命令。xterm
在后台发送,控件返回到列表中的前一个(vim
及其状态),该控件再次成为当前控件,并再次用 标记+
。xterm
而是新的以前的作业,并标有-
.由于您可以调用disown
后跟工作编号或 PID,因此您有两种变体
%-
:可以使用 来引用上一个作业%-
,如果您认为作业中也标有 ,可能更容易记住-
$!
:后台运行的最后一个作业的PID在特殊参数[ 2 ]中。$!
该命令disown
将接受两者。
参考
归档时间: |
|
查看次数: |
3646 次 |
最近记录: |