Ini berfungsi untuk ZSH dan 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 answer tidak berhasil untuk saya.
Lebih lanjut di sini:https://Gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
seseorang harus menggunakan builtin
perintah bawaan zsh bersama dengan kill
lainnya zsh perintah bawaan sebagai:
builtin kill %1
sebagai kill
juga merupakan file biner yang terpisah dari util-linux
paket (upstream, mirror) terletak di /usr/bin/kill
yang tidak mendukung pekerjaan (kill: cannot find process "%1"
).
gunakan kata kunci builtin
untuk menghindari konflik nama atau enable
kill
bawaan jika dinonaktifkan.
ada konsep menonaktifkan dan mengaktifkan perintah bawaan (mis. perintah Shell sendiri seperti cd
dan kill
) di shell, dan di zsh Anda dapat mengaktifkan (dinonaktifkan) kill
bawaan sebagai:
enable kill
keluarkan disable
untuk memeriksa apakah builtin dinonaktifkan (dan enable
untuk melihat yang diaktifkan).
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. Itu zsh, tidak perlu alat eksternal.
Jika Anda ingin membunuh pekerjaan nomor N:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
Penyesuaian kecil pada respons @Zxy...
Di sistem saya, saya menemukan bahwa pekerjaan yang ditangguhkan tidak dimatikan dengan benar dengan sinyal mematikan default. Saya harus benar-benar mengubahnya menjadi kill -KILL
untuk mendapatkan suspended
pekerjaan latar belakang untuk mati dengan benar.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Berikan perhatian khusus pada KUTIPAN TUNGGAL di sekitar ini. Jika Anda beralih ke tanda kutip ganda, Anda harus keluar dari setiap "$". Perhatikan bahwa Anda TIDAK dapat menggunakan function
untuk membungkus perintah ini karena fungsi akan menambah $jobstates
array yang menyebabkan fungsi mencoba mematikan dirinya sendiri... Harus menggunakan alias.
killjob
skrip di atas agak berlebihan karena Anda bisa melakukan:
kill %1
Lebih sedikit penekanan tombol dan sudah dibuat menjadi zsh
.