Cela fonctionne à la fois pour ZSH et 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 réponse de @zyx n'a pas fonctionné pour moi.
Plus d'informations ici :https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
il faut utiliser le builtin
la commande intégrée zsh avec l'autre kill
commande intégrée zsh comme :
builtin kill %1
comme kill
est également un fichier binaire séparé à partir de util-linux
package (amont, miroir) situé dans /usr/bin/kill
qui ne prend pas en charge les emplois (kill: cannot find process "%1"
).
utilisez le mot-clé builtin
pour éviter les conflits de noms ou enable
le kill
intégré s'il est désactivé.
il existe un concept de désactivation et d'activation des commandes intégrées (c'est-à-dire les propres commandes du shell telles que cd
et kill
) dans les shells, et dans zsh, vous pouvez activer (désactivé) kill
intégré comme :
enable kill
émettre disable
pour vérifier si le builtin est désactivé (et enable
pour voir ceux qui sont activés).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. C'est zsh, pas besoin d'outils externes.
Si vous voulez tuer le travail numéro N :
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Ajustement mineur de la réponse de @Zxy...
Sur mon système, j'ai constaté que les travaux suspendus n'étaient pas correctement supprimés avec le signal de suppression par défaut. J'ai dû le changer en kill -KILL
pour obtenir suspended
les tâches d'arrière-plan disparaissent correctement.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Portez une attention particulière aux CITATIONS SIMPLES autour de cela. Si vous passez aux guillemets doubles, vous devrez échapper chaque "$". Notez que vous ne pouvez PAS utiliser un function
pour envelopper cette commande puisque la fonction incrémentera le $jobstates
tableau obligeant la fonction à essayer de se tuer... Doit utiliser un alias.
Le killjob
le script ci-dessus est un peu redondant puisque vous pouvez simplement faire :
kill %1
Moins de frappes et c'est déjà intégré à zsh
.