如标题 - 如何杀死 zsh 中的所有后台进程?
5 回答
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. 它是 zsh,不需要外部工具。
如果你想杀死工作编号 N:
function killjob()
{
emulate -L zsh
for jobnum in $@ ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
应该将builtin
zsh 内置命令与其他kill
zsh 内置命令一起使用:
builtin kill %1
askill
也是一个独立的二进制文件,来自不支持作业( ) 的util-linux
包(上游、镜像)。/usr/bin/kill
kill: cannot find process "%1"
使用关键字builtin
来避免名称冲突或内置(如果它被禁用)enable
。kill
在 shell 中有一个禁用和启用内置命令(即 shell 自己的命令,例如cd
and kill
)的概念,在zsh中,您可以启用(禁用的)kill
内置命令:
enable kill
disable
检查内置是否被禁用(并enable
查看启用的)的问题。
对@Zxy 的回复稍作调整……
在我的系统上,我发现挂起的作业没有被默认的终止信号正确终止。我实际上必须将其更改kill -KILL
为让suspended
后台工作正常结束。
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
请特别注意围绕此的单引号。如果切换到双引号,则需要转义每个“$”。请注意,您不能使用 afunction
来包装此命令,因为该函数将增加$jobstates
数组,从而导致该函数尝试杀死自己...必须使用别名。
上面的killjob
脚本有点多余,因为你可以这样做:
kill %1
更少的击键,它已经内置到zsh
.
这适用于 ZSH 和 Bash:
: '
killjobs - Run kill on all jobs in a Bash or ZSH shell, allowing one to optionally pass in kill parameters
Usage: killjobs [zsh-kill-options | bash-kill-options]
With no options, it sends `SIGTERM` to all jobs.
'
killjobs () {
local kill_list="$(jobs)"
if [ -n "$kill_list" ]; then
# this runs the shell builtin kill, not unix kill, otherwise jobspecs cannot be killed
# the `$@` list must not be quoted to allow one to pass any number parameters into the kill
# the kill list must not be quoted to allow the shell builtin kill to recognise them as jobspec parameters
kill $@ $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
else
return 0
fi
}
@zyx 答案对我不起作用。
更多信息在这里:https ://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`;