在标题中 - 如何杀死zsh中的所有后台进程?
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
因为kill
也是util-linux
package(upstream,mirror)的单独二进制文件,位于/usr/bin/kill
,不支持工作(kill: cannot find process "%1"
)。
使用关键字builtin
来避免名称冲突或enable
内置的kill
如果被禁用。
在shell中有一个禁用和启用内置命令(即shell自己的命令,如cd
和kill
)的概念,在zsh中,您可以启用(禁用)kill
内置为:
enable kill
发出disable
以检查内置是否被禁用(和enable
查看已启用的内容)。
这适用于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
对@ Zxy的回应进行微调......
在我的系统上,我发现使用默认的kill信号没有正确杀死挂起的作业。我不得不将它改为kill -KILL
以使suspended
背景工作正常死亡。
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
特别注意周围的单一报价。如果您切换到双引号,则需要转义每个“$”。请注意,您不能使用function
来包装此命令,因为该函数将增加$jobstates
数组,导致函数尝试自杀...必须使用别名。
上面的killjob
脚本有点多余,因为你可以这样做:
kill %1
更少的击键,它已经建立在zsh
。
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`;