Toto funguje pro ZSH i 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
}
Odpověď @zyx pro mě nefungovala.
Více o tom zde:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
jeden by měl použít builtin
zsh vestavěný příkaz spolu s dalším kill
vestavěný příkaz zsh jako:
builtin kill %1
jako kill
je také samostatný binární soubor od util-linux
balíček (upstream, mirror) umístěný v /usr/bin/kill
který nepodporuje pracovní místa (kill: cannot find process "%1"
).
použijte klíčové slovo builtin
abyste předešli konfliktu jmen nebo enable
kill
vestavěný, pokud je zakázán.
existuje koncept deaktivace a povolení vestavěných příkazů (tj. vlastních příkazů shellu, jako je cd
a kill
) v shellech a v zsh můžete povolit (vypnuto) kill
vestavěný jako:
enable kill
problém disable
zkontrolovat, zda je vestavěný modul zakázán (a enable
pro zobrazení povolených).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. Je to zsh, nepotřebujete externí nástroje.
Pokud chcete zabít úlohu číslo N:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Menší úprava odpovědi @Zxy...
V mém systému jsem zjistil, že pozastavené úlohy nebyly správně ukončeny výchozím signálem zabíjení. Musel jsem to změnit na kill -KILL
získat suspended
úlohy na pozadí, aby správně zemřely.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Věnujte zvláštní pozornost JEDNOTLIVÝM UVÁDĚNÍM. Pokud jste přepnuli na dvojité uvozovky, museli byste ukončit každé "$". Pamatujte, že NELZE použít function
zalomit tento příkaz, protože funkce zvýší hodnotu $jobstates
pole způsobí, že se funkce pokusí zabít... Musí použít alias.
killjob
výše uvedený skript je trochu nadbytečný, protože můžete udělat:
kill %1
Méně stisknutí kláves a již je zabudováno do zsh
.