bash 内置命令“suspend”的用途是什么?

bash 内置命令“suspend”的用途是什么?

我输入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-NRSIGCONT 信号时,信号会发送到冻结终端并将其解冻,以便它解冻。

但是,暂停终端的真正目的是什么?哪些日常应用程序是典型的?将其内置于 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是一位会议主持人。如果会话领导者被挂起,如果我们采用旧时间终端的视图,用户将无法恢复它。

bashsuspend通过拒绝登录 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来代替。

相关内容