Apa tujuan dari perintah bash `suspend` builtin?

22

Saya mengetik help suspenddan mendapatkan penjelasan singkat ini:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

Bagaimana saya mengerti ini adalah: Saya mengetik suspenddan terminal membeku, bahkan strg + c tidak bisa mencairkannya. Tetapi ketika saya membuka terminal lain dan mencari PID untuk yang beku dan ketik kill -SIGCONT PID-NRsinyal SIGCONT dikirim ke terminal beku dan mencairkannya, sehingga tidak membeku.

Tapi, apa sebenarnya tujuan menangguhkan terminal? Aplikasi mana yang khas untuk setiap hari? Apa yang ada dalam pikiran orang-orang yang membuatnya menjadi shell?

sharkant
sumber
2
hindari menjalankan program eksternal (bunuh) untuk ditangguhkan.
Ipor Sircer

Jawaban:

23

Jika Anda memulai shell dari shell lain, Anda dapat menangguhkan yang dalam. Katakan ketika menggunakan su, dan ingin beralih kembali ke pengguna biasa sejenak:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(Jika Anda melakukan itu, jangan lupa shell istimewa dibuka di latar belakang ...)

Demikian pula, jika Anda melarikan diri ke shell dari beberapa program lain ( !perintah dalam mis. less), Anda masih dapat menangguhkan shell. Tapi saya tidak akan berharap banyak program lain untuk menanganinya dengan baik ketika mereka meluncurkan subproses, yang kemudian ditangguhkan sendiri.

ilkkachu
sumber
1
Saya baru saja mencoba berlari vim, dan melakukan :shuntuk mendapatkan subkulit (khususnya, zshsubkulit). Berjalan suspendmemasukkan saya ke shell asli (itu menangguhkan subkulit dan vim).
Kevin
1
@ Kevin, zshtampaknya lebih pintar dari itu bash, saya mencoba melarikan diri ke keduanya lessdan vi(Debian vim.tiny): zshmenghentikan aplikasi induk juga, bashmenggantung semuanya. bashuntuk bashbekerja.
ilkkachu
1
saya tidak sadar, bahwa apa yang saya ketik sudo su a subshell dimulai. ketika saya mengetik menangguhkan di shell utama shell hanya membeku, tetapi bagaimana Anda menunjukkan, ketika saya menambahkannya di dalam subshell saya otomatis kembali ke shell utama.
sharkant
25

Itu sama dengan menekan Ctrl+Zpada perintah lain.

Ini menangguhkan shell dan memberikan kontrol kembali ke shell induk atau proses jika ada.

Contoh:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

Fitur ini berasal dari csh, cangkang BSD (di mana kontrol pekerjaan berasal) di awal 80-an .

Di AT&T ksh, ini adalah alias bawaan untuk kill -s STOP $$( ya, tanpa tanda kutip! )

Dalam kasus Anda, bashmungkin yang dimulai langsung oleh terminal emulator. Dan emulator terminal Anda tidak mengharapkan proses untuk ditangguhkan.

Itu bashadalah pemimpin sesi. Jika ketua sesi ditangguhkan, jika kita melihat terminal waktu lama, pengguna tidak akan bisa melanjutkannya.

bashalamat itu dengan menolak suspendjika itu adalah shell login. Tetapi dalam kasus Anda, emulator terminal Anda mungkin tidak mulai bashdalam mode masuk, sehingga perlindungan tidak ada.

zshdan mkshtidak memiliki masalah karena mereka mengirim sinyal SIGTSTP(yang juga dikirim Ctrl+Z) seperti csh bukannya SIGSTOP(dan ke grup proses pemanggil untuk mkshseperti di csh, dan ke grup proses utama shell untuk zsh, bukan $$proses saja ). SIGTSTPdiabaikan ketika dikirim ke grup proses yatim, dan grup pemimpin memenuhi syarat. Idenya adalah bahwa SIGTSTP tidak boleh menunda sesuatu yang tidak dapat dilanjutkan oleh pengguna.

Dalam mkshatau yash, seseorang juga dapat menggunakan suspenduntuk menangguhkan subkulit itu sendiri:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

Itu tidak akan bekerja dengan zshyang mengirim SIGTSTP ke grup proses utama alih-alih pemanggil. Dalam setiap shell yang memiliki killbuiltin, kita selalu dapat menggunakannya kill -s TSTP 0.

Stéphane Chazelas
sumber
4
Anda dapat mengutip penggunaan umum untuk menangguhkan adalah: di bash (dan mungkin banyak shell): ketika Anda memulai perintah yang panjang, dan tidak ingin menyela tetapi jika Anda melakukannya di latar belakang (yaitu, Anda ingin command .... &tetapi Anda lupa &dan sekarang harap Anda dapat menambahkannya tanpa mengganggu perintah): Anda dapat:, ctrl-zlalu ketik: bguntuk melanjutkan tugas yang terakhir ditangguhkan di latar belakang. (atau bg %nuntuk melakukan ini dengan nomor tugas n. Gunakan jobsuntuk mendapatkan daftar tugas yang ditangguhkan atau sedang berjalan)
Olivier Dulac
5
@OlivierDulac, itu tidak akan menjelaskan untuk apa suspend perintah sebenarnya .
Wildcard