Questo funziona sia per ZSH che per 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 risposta @zyx non ha funzionato per me.
Maggiori informazioni qui:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
si dovrebbe usare il builtin
zsh comando integrato insieme all'altro kill
zsh comando integrato come:
builtin kill %1
come kill
è anche un file binario separato da util-linux
pacchetto (upstream, mirror) che si trova in /usr/bin/kill
che non supporta posti di lavoro (kill: cannot find process "%1"
).
usa la parola chiave builtin
per evitare conflitti di nome o enable
l'kill
integrato se è disabilitato.
esiste un concetto di disabilitazione e abilitazione dei comandi integrati (ad es. i comandi propri della shell come cd
e kill
) nelle shell e in zsh puoi abilitare (disabilitato) kill
incorporato come:
enable kill
numero disable
per verificare se il builtin è disabilitato (e enable
per vedere quelli abilitati).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. È zsh, non c'è bisogno di strumenti esterni.
Se vuoi uccidere il lavoro numero N:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Piccolo aggiustamento alla risposta di @Zxy...
Sul mio sistema, ho scoperto che i lavori sospesi non venivano interrotti correttamente con il segnale di interruzione predefinito. Ho dovuto effettivamente cambiarlo in kill -KILL
per ottenere suspended
lavori in background per morire correttamente.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Presta particolare attenzione alle virgolette singole intorno a questo. Se sei passato alle virgolette doppie, dovresti eseguire l'escape di ogni "$". Nota che NON puoi usare un function
per eseguire il wrapping di questo comando poiché la funzione incrementerà $jobstates
array che fa sì che la funzione tenti di uccidersi... Deve usare un alias.
Il killjob
script sopra è un po' ridondante dato che puoi semplicemente fare:
kill %1
Meno sequenze di tasti ed è già integrato in zsh
.