我输入help suspend
并得到了这个简短的解释:
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.
我的理解是:我输入suspend
并且终端冻结,甚至 strg + c 也无法解冻它。但是,当我打开另一个终端并搜索冻结终端的 PID 并键入kill -SIGCONT PID-NR
SIGCONT 信号时,信号会发送到冻结终端并将其解冻,以便它解冻。
但是,暂停终端的真正目的是什么?哪些日常应用程序是典型的?将其内置于 shell 的人们的想法是什么?
答案1
如果从另一个 shell 启动一个 shell,则可以挂起内部 shell。当使用su
并想暂时切换回普通用户时说:
user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...
(如果您这样做,请不要忘记在后台打开的特权 shell...)
同样,如果您从其他程序转义到 shell(!
例如 中的命令less
),您仍然可以挂起该 shell。但我不希望许多其他程序在启动子进程时能够很好地处理它,然后子进程会自行挂起。
答案2
这相当于按下Ctrl+Z其他命令。
它挂起 shell 并将控制权交还给父 shell 或进程(如果有)。
例子:
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 的 shell(作业控制来自于此)80年代初。
在 AT&T 中ksh
,它是kill -s STOP $$
(是的,没有引号!)
就您而言,bash
可能是由终端模拟器直接启动的。并且您的终端模拟器并没有预料到该进程会被挂起。
那bash
是一位会议主持人。如果会话领导者被挂起,如果我们采用旧时间终端的视图,用户将无法恢复它。
bash
suspend
通过拒绝登录 shell来解决这个问题。但就您而言,您的终端模拟器可能不会bash
以登录模式启动,因此安全措施没有到位。
zsh
并且mksh
没有问题,因为它们发送一个SIGTSTP
(也发送过的Ctrl+Z)信号,如 csh 而不是SIGSTOP
( 以及像 csh 中那样发送到调用者的进程组mksh
,以及发送到 shell 的主进程组 for zsh
,而不是$$
单独的进程)。SIGTSTP
当交付给孤立进程组时会被忽略,并且领导者的组符合资格。这个想法是 SIGTSTP 不应该暂停用户无法恢复的某些操作。
在mksh
或中yash
,还可以使用suspend
让子 shell 自行挂起:
$ (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
内置功能的 shell 中,您始终可以使用它kill -s TSTP 0
来代替。