Esto funciona tanto para ZSH como para 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 `example@unixlinux.online` 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 example@unixlinux.online $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
else
return 0
fi
}
La respuesta de @zyx no funcionó para mí.
Más sobre esto aquí:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
uno debe usar el builtin Comando integrado zsh junto con el otro kill Comando integrado zsh como:
builtin kill %1
como kill también es un archivo binario separado de util-linux paquete (upstream, espejo) ubicado en /usr/bin/kill que no admite empleos (kill: cannot find process "%1" ).
use la palabra clave builtin para evitar conflictos de nombres o enable el kill incorporado si está deshabilitado.
existe un concepto de deshabilitar y habilitar comandos incorporados (es decir, los propios comandos de shell como cd y kill ) en shells, y en zsh puede habilitar (un deshabilitado) kill incorporado como:
enable kill
problema disable para verificar si el incorporado está deshabilitado (y enable para ver las habilitadas).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. Es zsh, no necesita herramientas externas.
Si quieres eliminar el trabajo número N:
function killjob()
{
emulate -L zsh
for jobnum in example@unixlinux.online ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Ajuste menor a la respuesta de @Zxy...
En mi sistema, descubrí que los trabajos suspendidos no se eliminaron correctamente con la señal de eliminación predeterminada. De hecho, tuve que cambiarlo a kill -KILL para obtener suspended trabajos de fondo para morir correctamente.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Preste especial atención a las COMILLAS SIMPLES alrededor de esto. Si cambiaste a comillas dobles, tendrías que escapar de cada "$". Tenga en cuenta que NO puede usar un function para envolver este comando ya que la función incrementará el $jobstates matriz que hace que la función intente suicidarse... Debe usar un alias.
El killjob el script de arriba es un poco redundante ya que puedes hacer:
kill %1
Menos pulsaciones de teclas y ya está integrado en zsh .