Это эквивалентно нажатию Ctrl+Zв других командах.
Он приостанавливает оболочку и возвращает управление родительской оболочке или процессу, если таковые имеются.
Пример:
zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal) bash
zsh$ fg
[1] + continued bash
bash-4.4$ pwd
/
Эта функция появилась в csh, оболочке BSD (откуда происходит управление заданиями) в начале 80-х годов .
В AT & T ksh
это встроенный псевдоним для kill -s STOP $$
( да, без кавычек! )
В вашем случае это bash
был, вероятно, тот, который был запущен непосредственно эмулятором терминала. И ваш эмулятор терминала не ожидал, что процесс будет приостановлен.
Это bash
был лидер сессии. Если лидер сеанса приостановлен, если мы возьмем представление о старых временных терминалах, у пользователя не будет возможности возобновить его.
bash
адреса, отказываясь, suspend
если это оболочка входа в систему. Но в вашем случае ваш эмулятор терминала, вероятно, не запускается bash
в режиме входа в систему, так что защита не на месте.
zsh
и mksh
не имеют проблемы, потому что они посылают SIGTSTP
(тот, который также был отправлен Ctrl+Z) сигнал, такой как csh вместо SIGSTOP
(и в группу процессов вызывающей стороны для mksh
как в csh, и в главную группу процессов оболочки для zsh
, а не сам $$
процесс ). SIGTSTP
игнорируется при доставке в осиротевшую группу процессов, а группа лидера квалифицируется. Идея состоит в том, что SIGTSTP не должен приостанавливать то, что не может быть возобновлено пользователем.
В mksh
или yash
, также можно использовать suspend
для приостановки подоболочки:
$ (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
Это не сработает zsh
, так как SIGTSTP отправляется основной группе процессов, а не вызывающей стороне. В любой оболочке, которая имеет kill
встроенную функцию, всегда можно использовать kill -s TSTP 0
вместо нее .