如何杀死zsh中的所有后台进程?

如在标题 – 如何杀死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 -KILLsuspended后台作业。

 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来避免名称冲突