Saya mengikuti pola menunda tugas ini dan kemudian membiarkannya untuk melanjutkan terlalu sering dengan Ctrl-Z bgurutan.
Saya bertanya-tanya apakah ada cara untuk mengompresi itu menjadi penekanan tombol tunggal?
Kulitku zsh
Saya mengikuti pola menunda tugas ini dan kemudian membiarkannya untuk melanjutkan terlalu sering dengan Ctrl-Z bgurutan.
Saya bertanya-tanya apakah ada cara untuk mengompresi itu menjadi penekanan tombol tunggal?
Kulitku zsh
Jawaban:
The Ctrl+ ZUrutan ditangani oleh terminal, bukan oleh shell. (Latar belakang yang berguna: Apa perbedaan yang tepat antara 'terminal', 'shell', 'tty' dan 'konsol'? )
Hanya sejumlah kecil fungsi yang tidak dapat diperluas yang dapat diikat ke kunci di terminal . Anda dapat menyesuaikan tombol yang terikat pada fungsi-fungsi ini tetapi tidak menambahkan fungsi lain. Fungsi-fungsi ini terbagi dalam tiga kategori:
eof
, Ctrl+ D), ujung baris ( eol
, Ctrl+ M), hapus karakter kiri ( erase
, Ctrl+ H), hapus kata kiri ( werase
, Ctrl+ W), hapus baris ( kill
, Ctrl+ U).stop
( Ctrl+ S), start
( Ctrl+ Q). Hanya berguna pada terminal serial lama yang menjatuhkan karakter ketika terminal tidak dapat mengimbangi komputer atau sebaliknya.intr
, Ctrl+ C), paksa berhenti ( quit
, Ctrl+ \), menangguhkan ( Ctrl+ Z).Beberapa sistem, termasuk Linux, memperpanjang daftar itu, tetapi saya belum pernah melihat yang mencakup latar belakang. Perhatikan bahwa ini akan membutuhkan dukungan di driver terminal di kernel, dan di emulator terminal. Jadi, Anda harus puas dengan menangguhkan, yang mengirimkan sinyal SIGTSTP ke pekerjaan latar depan . Ini memicu SIGCHLD dalam proses induk dari pemimpin pekerjaan latar depan, yang biasanya shell. Ketika shell menerima SIGCHLD, ia memanggil waitpid
untuk mencari tahu mengapa ia diberitahukan, dan setelah terdeteksi bahwa pekerjaan latar belakang ditangguhkan, ia menampilkan pemberitahuan (mis. [1] + 12345 suspended mycommand
) Dan prompt baru.
Anda bisa memprogram shell untuk mengirim SIGCONT
sinyal ke pekerjaan latar depan. Saya tidak berpikir zsh memiliki pengait untuk itu, Anda perlu menambal kode sumber. Dan tidak ada cara bagi zsh untuk mengetahui apakah Anda benar-benar bermaksud mengganggu program (oops, program ini mungkin melakukan hal yang salah, izinkan saya menunda sementara saya mengatasinya) atau untuk latar belakangnya.
Apa yang saya lakukan adalah mengatur urutan tombol Ctrl+ Zdi zsh untuk latar belakang pekerjaan saat ini ( %%
). Dengan begitu, saya bisa mengirim pekerjaan latar ke latar belakang dengan menekan Ctrl+ Z Ctrl+ Z. Sementara saya melakukannya, saya membuat Ctrl+ Zmelakukan sesuatu yang bermanfaat ketika jalur input saat ini tidak kosong (jadi saya tidak baru saja kembali dari subproses): "menangguhkan" jalur input saat ini, memungkinkan saya untuk mengetik perintah lain , setelah itu jalur terputus didorong kembali ke buffer input.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
^ z ^ z seperti zsh di atas adalah mungkin di bash, meskipun agak kludgy dan saya belum menjalankan ini lama:
"\C-z": "bg\n"
jadi ^ z untuk menangguhkan diaktifkan ketika perintah dijalankan, kemudian dimatikan untuk bash prompt.
Jadi menemukan solusinya, bukan apa yang saya inginkan tetapi sangat dekat dari sini /superuser//a/161922/35223
Pada baris perintah kosong jalankan bg (sehingga Ctrl + Z Ctrl + Z menunda program dan segera melanjutkannya di latar belakang).
Ctrl+Z
panggilan bg
, saya tidak yakin tentang mendeteksi jalur input yang tidak kosong).
Apakah perintah ini yang ingin Anda jalankan di latar depan awalnya, dan kemudian beralih ke latar belakang? Saya tidak tahu apakah ada cara yang lebih sederhana untuk melakukannya. Tetapi jika Anda ingin menjalankan perintah yang akan berada di latar belakang untuk memulai, Anda bisa menambahkan ampersand ke akhir baris. misalnya, ping google.com &
akan mulai melakukan ping di latar belakang; Anda tidak akan dapat berinteraksi dengannya kecuali Anda mengetik fg
.