Apa tujuan dari penundaan sementara (Ctrl-Y) di Bash?

30

Bagian penuh dari halaman manual Bash yang hanya berlaku mengatakan:

Jika sistem operasi tempat bash berjalan mendukung kontrol pekerjaan, bash berisi fasilitas untuk menggunakannya. Mengetik karakter yang ditangguhkan (biasanya ^ Z, Control-Z) saat proses sedang berjalan menyebabkan proses tersebut dihentikan dan mengembalikan kontrol ke bash. Mengetik karakter menangguhkan tertunda (biasanya ^ Y, Control-Y) menyebabkan proses dihentikan ketika mencoba membaca input dari terminal, dan kontrol dikembalikan ke bash. Pengguna kemudian dapat memanipulasi keadaan pekerjaan ini, menggunakan bg perintah untuk melanjutkannya di latar belakang, thefgperintah untuk melanjutkannya di latar depan, atau perintah kill untuk membunuhnya. A ^ Z segera berlaku, dan memiliki efek samping tambahan yang menyebabkan output yang tertunda dan ketik akan dibuang.

Saya tidak pernah menggunakan Ctrl- Y; Saya baru saja mempelajarinya. Saya baik-baik saja dengan Ctrl- Z(menangguhkan) saja.

Saya mencoba untuk membayangkan apa opsi ini untuk . Kapan itu berguna?

(Perhatikan bahwa fitur ini tidak ada pada semua varian Unix. Ada di Solaris dan FreeBSD tetapi tidak di Linux. Pengaturan yang sesuai adalah stty dsusp.)

Mungkin kurang subyektif: Apakah ada sesuatu yang dapat dicapai dengan Ctrl- Yyang tidak dapat dicapai dengan mudah dengan Ctrl- Z?

Wildcard
sumber
@Gilles, meskipun FreeBSD tampaknya memiliki stty dsusp, saya belum berhasil membuatnya mengirim SIGTSTP setelah ^ Y (saya lakukan pada Solaris). Sudahkah Anda?
Stéphane Chazelas

Jawaban:

23

Dari manual 4BSD untuk csh :

A ^Zberlaku segera dan seperti interupsi dalam output yang tertunda dan input yang belum dibaca dibuang saat diketik. Ada kunci khusus lain ^Yyang tidak menghasilkan sinyal STOP sampai suatu program mencoba untuk membacanya (2). Ini dapat dengan mudah diketik di depan ketika Anda telah menyiapkan beberapa perintah untuk pekerjaan yang Anda ingin hentikan setelah membacanya.

Jadi, tujuannya adalah untuk mengetikkan beberapa input saat yang pertama sedang diproses, dan menghentikan pekerjaan setelah selesai.

Random832
sumber
Deskripsi ini agak berbeda dari manual bash. "... tidak menghasilkan sinyal STOP sampai suatu program mencoba untuk membacanya . " Kedengarannya semua yang ada di aliran input hingga yang ^Yakan dibaca berhasil, dan kemudian ketika ^Ydipukul proses akan dihentikan. Apakah saya membaca ini?
Wildcard
@Wildcard dalam pengujian saya pada Mac OS X, proses dihentikan sebelum read () kembali (tetapi setelah panggilan untuk membaca () yang akan mengembalikan Y berjalan), dan setelah itu dilanjutkan menerima input dari sebelum ^ Y . Saya pikir karena ini dimaksudkan untuk digunakan, meskipun, itu akan digunakan pada awal baris, sehingga perilaku dalam kasus ini tidak masalah. Saya menduga bahwa dalam kode aktual, itu ditangguhkan ketika ^ Y akan disalin ke dalam buffer proses baca pengguna.
Random832
Saya benar, dalam fungsi ttread kernel BSD asli Anda dapat melihat ini, dan OSX modern
Random832
Tetapi, ketika proses dilanjutkan, panggilan akan berhasil dan akan berisi data yang Anda ketikkan ke terminal Anda sebelumnya ^Y, bahkan jika Anda telah menolak proses dan menutup terminal Anda sebelum proses dilanjutkan. Kanan? ( "... setelah itu dilanjutkan, ia menerima masukan dari sebelumnya ^ Y." Itulah yang saya maksud; Saya biasanya tidak berurusan dengan kode C.) :)
Wildcard
Iya nih. Dan itu kembali tanpa baris baru di akhir, yang tidak biasa untuk dibaca dalam mode kanonik [mirip dengan jika Anda mengetik teks dan kemudian menekan ^ D sekali] Saya menduga mereka tidak terlalu banyak memikirkan kasus ini, karena itu benar-benar dimaksudkan untuk diketik di awal baris.
Random832
11

Katakanlah ada loop membaca input dan mengeksekusi. Mungkin bermanfaat untuk membiarkan tugas menyelesaikan instruksi saat ini yang dikomputasinya, tanpa memotongnya sebelum kembali ke baris perintah untuk yang baru. Jadi dengan demikian untuk mengakhiri suatu siklus. Ini mengakhiri loop dengan anggun dan mencegahnya berjalan lagi jika readberada di bawah batasan waktu habis.

Tomasz
sumber
Tetapi jika itu akan mencoba membaca input dari terminal, itu akan berhenti pada saat itu (dan menunggu input Anda), dan Anda dapat ^Zmelakukannya kemudian .
Wildcard
Iya nih. Lihat pembaruan.
Tomasz
Periksa satu lagi. @Wildcard
Tomasz
1
Tetapi jika ada batas waktu, bukankah itu juga akan berakhir dengan anggun jika Anda tidak melakukan sesuatu yang istimewa?
Daniel Wagner
1
Itu mungkin. Tetapi mungkin juga berjalan dan melakukan beberapa pekerjaan standar.
Tomasz
4

Saya bisa memikirkan satu skenario di mana itu mungkin berguna, tetapi itu adalah kasus tepi yang dibuat-buat.

Misalkan Anda sedang men-debug skrip yang sedang menulis file sementara yang ingin Anda analisis sebelum dihapus sebagai bagian dari rutinitas pembersihan.

Anda dapat menambahkan suatu read footempat setelah file ditulis (tetapi sebelum pembersihan), jalankan skrip, dan tekan Ctrl- Ysaat sedang dibuat. Anda kemudian akan dibawa ke prompt dengan skrip ditangguhkan di latar belakang untuk melakukan apa pun yang perlu Anda lakukan, dan kemudian fgdapat memungkinkan skrip untuk menyelesaikan.

DopeGhoti
sumber
1
Sepertinya tidak mungkin, karena skrip tetap akan menunggu input. Jadi Anda bisa dengan mudah melihatnya untuk meminta Anda untuk input dan kemudian menangguhkannya ^Z. Dengan kata lain: setelah Anda mengetik fgAnda akan harus memberikan script beberapa masukan pula sebelum itu akan terus berlanjut. Karena itu pertanyaan saya; Saya masih tidak mengerti maksudnya ^Y. (Terima kasih telah menjawab!) :)
Wildcard
2

Satu-satunya skenario yang dapat saya pikirkan (dan bahkan saya tidak merasa sangat meyakinkan), adalah jika Anda ingin menggunakan beberapa jenis-depan untuk perintah shell. Katakanlah beberapa perintah sedang berjalan yang akan membaca input beberapa waktu di masa depan. Maka Anda dapat ^ Y itu, dan kemudian segera ketik perintah shell berikutnya yang ingin Anda jalankan ketika perintah yang berjalan ditangguhkan. Saya tidak berpikir saya pernah benar-benar menggunakan ini dalam beberapa dekade menggunakan BSD Unix.

Olaf Seibert
sumber