Questo è l'equivalente di premere Ctrl+Zaltri comandi.
Sospende la shell e restituisce il controllo alla shell genitore o al processo, se presente.
Esempio:
zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal) bash
zsh$ fg
[1] + continued bash
bash-4.4$ pwd
/
La funzionalità deriva da csh, la shell di BSD (da cui proviene il controllo del lavoro) nei primi anni '80 .
In AT&T ksh
, è un alias incorporato per kill -s STOP $$
( sì, senza virgolette! )
Nel tuo caso, è bash
stato probabilmente quello avviato direttamente dall'emulatore di terminale. E il tuo emulatore di terminale non si aspettava che il processo fosse sospeso.
Quello bash
era un leader della sessione. Se il leader della sessione è sospeso, se consideriamo i vecchi terminali temporali, l'utente non avrà modo di riprenderlo.
bash
risolve il problema rifiutando suspend
se si tratta di una shell di accesso. Ma nel tuo caso, l'emulatore di terminale probabilmente non si avvia bash
in modalità di accesso, quindi la protezione non è in atto.
zsh
e mksh
non hanno il problema perché inviano un segnale SIGTSTP
(quello anche inviato Ctrl+Z) come csh invece di SIGSTOP
(e al gruppo di processi del chiamante per mksh
come in csh, e al gruppo di processi principale della shell per zsh
, non $$
solo il processo ). SIGTSTP
viene ignorato quando viene consegnato a un gruppo di processi orfano e il gruppo del leader si qualifica. L'idea è che SIGTSTP non dovrebbe sospendere qualcosa che non può essere ripreso da un utente.
In mksh
o yash
, si può anche usare suspend
per far sospendere una subshell:
$ (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
Ciò non funzionerebbe con l' zsh
invio di SIGTSTP al gruppo di processi principale anziché al chiamante. In qualsiasi shell che ha kill
incorporato, si può sempre usare kill -s TSTP 0
invece.