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 `[email protected]` 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 [email protected] $(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 [email protected] ; 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
.