Bagaimana saya bisa melakukan Ctrl-Z dan bg dalam satu penekanan tombol untuk membuat proses berlanjut di latar belakang?

25

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

Evgeniy Dolzhenko
sumber
Saya ingin mengatakan bahwa itu mungkin kode yang sulit. Tapi saya tidak 100%
Chad Harrison
Tentu saja, tapi saya telah menemukan solusi yang elegan, terima kasih superuser.com/a/161922/35223
Evgeniy Dolzhenko

Jawaban:

24

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:

  • Edisi baris perintah dalam program yang tidak menyediakan sendiri (mode kanonik, juga disebut mode matang (dengan oposisi dengan mode mentah), yang jarang Anda gunakan dalam praktik): akhir file ( 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).
  • Kontrol aliran manual: stop( Ctrl+ S), start( Ctrl+ Q). Hanya berguna pada terminal serial lama yang menjatuhkan karakter ketika terminal tidak dapat mengimbangi komputer atau sebaliknya.
  • Pemberian sinyal: interrupt ( 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 waitpiduntuk 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 SIGCONTsinyal 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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Gilles, ini adalah jawaban yang sangat lengkap, mendidik, dan bijaksana yang tidak bisa kudapat! Terima kasih banyak!
Evgeniy Dolzhenko
2

^ z ^ z seperti zsh di atas adalah mungkin di bash, meskipun agak kludgy dan saya belum menjalankan ini lama:

  • Dalam .inputrc Anda, sertakan pemetaan "\C-z": "bg\n"
  • Dalam variabel bash PS0 termasuk `$ (stty susp ^ z) '
  • Dalam variabel bash PROMPT_COMMAND, sertakan 'stty susp ^ @'

jadi ^ z untuk menangguhkan diaktifkan ketika perintah dijalankan, kemudian dimatikan untuk bash prompt.

JohnLittle
sumber
1

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).

Evgeniy Dolzhenko
sumber
Saya akan perhatikan bahwa ini memerlukan zsh; itu tidak didukung di bash. (di luar kotak, sih)
Kevin M
@KevinM Anda dapat menulis fungsi analog di bash (setidaknya versi dasar yang membuat Ctrl+Zpanggilan bg, saya tidak yakin tentang mendeteksi jalur input yang tidak kosong).
Gilles 'SANGAT berhenti menjadi jahat'
0

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.

octern
sumber
1
Terima kasih, masalahnya adalah kadang-kadang Anda tidak memiliki gagasan tentang berapa lama waktu menjalankan perintah akan diperlukan, sehingga Anda menjalankan secara interaktif dan kemudian menyadari Anda lebih baik membiarkannya melanjutkan di latar belakang. Jawaban yang diterima berhasil bagi saya, menggunakannya setiap hari!
Evgeniy Dolzhenko
Terima kasih atas tanggapannya. Jawaban yang diterima cukup rapi!
octern