如在标题 – 如何杀死zsh中的所有后台进程?
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
。 这是zsh,不需要外部工具。
如果你想杀死作业号码N:
function killjob() { emulate -L zsh for jobnum in $@ ; do kill ${${jobstates[$jobnum]##*:*:}%=*} done } killjob N
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`;
这适用于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
数组,导致函数尝试$jobstates
。必须使用别名。
上面的killjob
脚本有点多余,因为你可以这样做:
kill %1
更少的击键,它已经建立到zsh
。
对于archlinux上的 zsh , builtin kill %1
因为kill
是位于/usr/bin/kill
util-linux
软件包的一个二进制文件
不支持作业( kill: cannot find procses "%1"
)
使用关键字builtin
来避免名称冲突