Dies funktioniert sowohl für ZSH als auch für 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
}
@zyx Antwort hat bei mir nicht funktioniert.
Mehr dazu hier:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
man sollte den builtin
verwenden zsh eingebauter Befehl neben dem anderen kill
zsh eingebauter Befehl als:
builtin kill %1
als kill
ist auch eine separate binäre Datei ab util-linux
Paket (Upstream, Mirror) in /usr/bin/kill
die keine Arbeitsplätze fördert (kill: cannot find process "%1"
).
Verwenden Sie das Schlüsselwort builtin
um Namenskonflikte zu vermeiden oder enable
die kill
eingebaut, wenn es deaktiviert ist.
Es gibt ein Konzept zum Deaktivieren und Aktivieren integrierter Befehle (d. h. Shell-eigene Befehle wie cd
und kill
) in Shells und in zsh können Sie kill
aktivieren (ein deaktiviertes). eingebaut als:
enable kill
geben Sie disable
aus um zu prüfen, ob die eingebaute Funktion deaktiviert ist (und enable
um die aktivierten zu sehen).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. Es ist zsh, keine Notwendigkeit für externe Tools.
Wenn Sie Jobnummer N beenden möchten:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Kleine Anpassung an @Zxys Antwort...
Auf meinem System habe ich festgestellt, dass angehaltene Jobs nicht ordnungsgemäß mit dem Standard-Kill-Signal beendet wurden. Ich musste es tatsächlich in kill -KILL
ändern um suspended
zu erhalten Hintergrundjobs richtig sterben.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Achten Sie besonders auf die EINZELNEN ZITATE in diesem Zusammenhang. Wenn Sie zu doppelten Anführungszeichen wechseln, müssen Sie jedes "$" maskieren. Beachten Sie, dass Sie KEINEN function
verwenden können um diesen Befehl zu umbrechen, da die Funktion $jobstates
erhöht Array, wodurch die Funktion versucht, sich selbst zu töten ... Muss einen Alias verwenden.
Die killjob
Das obige Skript ist etwas überflüssig, da Sie einfach Folgendes tun können:
kill %1
Weniger Tastenanschläge und es ist bereits in zsh
eingebaut .