Isso é o equivalente a pressionar Ctrl + Z em outros comandos.
Ele suspende o shell e retorna o controle ao shell pai ou ao processo, se houver algum.
Exemplo:
zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal) bash
zsh$ fg
[1] + continued bash
bash-4.4$ pwd
/
O recurso vem do csh, o shell do BSD (de onde vem o controle de trabalho) no início dos anos 80 .
Em AT & T ksh
, é um alias interno para kill -s STOP $$
( sim, sem as aspas! )
No seu caso, bash
foi provavelmente o iniciado diretamente pelo emulador de terminal. E o seu emulador de terminal não esperava que o processo fosse suspenso.
Esse bash
foi um líder de sessão. Se o líder da sessão estiver suspenso, se considerarmos os terminais antigos, o usuário não terá como retomá-lo.
bash
corrige isso ao se recusar a suspend
se for um shell de login. Mas no seu caso, o emulador de terminal provavelmente não inicia o bash
no modo de login, então essa salvaguarda não está em vigor.
zsh
e mksh
não têm problema porque enviam um sinal SIGTSTP
(o que também é enviado com Z + ) como csh em vez de SIGSTOP
(e para o grupo de processos do chamador para mksh
como em csh e para o grupo de processos principal do shell para zsh
, não apenas para o processo $$
). SIGTSTP
é ignorado quando entregue a um grupo de processos órfão e o grupo do líder se qualifica. A ideia é que o SIGTSTP não deve suspender algo que não seja recuperável por um usuário.
Em mksh
ou yash
, também é possível usar suspend
para que uma subshell seja suspensa:
$ (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
Isso não funcionaria com zsh
que envia o SIGTSTP para o grupo de processos principal em vez do chamador. Em qualquer shell que tenha kill
integrado, sempre é possível usar kill -s TSTP 0
.