bash`suspend`内置命令的目的是什么?


22

我输入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的人想到了什么?


2
避免运行外部程序(杀死)进行挂起。
Ipor Sircer '17

Answers:


23

如果从另一个外壳启动一个外壳,则可以挂起内部外壳。说在使用时su,想暂时切换回普通用户:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(如果这样做,请不要忘记在后台打开特权shell ...)

同样,如果您从某个其他程序(!例如less)中的命令转至外壳程序,则仍可以挂起该外壳程序。但是,我不希望许多其他程序在启动子进程时会很好地处理它,然后该子进程将自身挂起。


1
我只是尝试运行vim,并做了一个:sh以获得子外壳程序(特别是一个zsh子外壳程序)。运行使suspend我跳入原始 shell(它暂停了subshel​​l和vim)。
凯文(Kevin)

1
@Kevin zsh在这方面似乎更聪明bash,我尝试从两者lessvi(Debian's vim.tiny)两者同时转义:也zsh停止了父应用程序,bash挂了整个东西。bash可以bash工作。
ilkkachu,

1
我不知道,我在子shell中输入sudo su的启动。当我在主shell中键入suspend时,shell只会冻结,但是您的显示方式是,当我在子shell中将其挂起时,我会自动返回主shell。
sharkant

25

这等效于按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
/

该功能来自80年代初期 BSD的外壳csh(工作控制来自该外壳)。

在AT&T中ksh,它是()的内置别名kill -s STOP $$是的,不带引号!

在您的情况下,bash可能是由终端仿真器直接启动的。而且您的终端仿真器并不希望进程被暂停。

bash是会议负责人。如果会话主持人被暂停,那么如果我们查看旧时间终端,用户将无法恢复它。

bash通过拒绝suspend它是否是登录外壳来解决该问题。但是在您的情况下,您的终端仿真器可能无法bash在登录模式下启动,因此没有适当的保护措施。

zshmksh没有问题,因为它们发送的信号SIGTSTP(也发送了一个Ctrl+Z信号)像csh而不是SIGSTOP(和csh一样发送给调用者的进程组,并发送给mkshshell的主进程组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

zshSIGTSTP发送到主进程组而不是调用方的方法不起作用。在任何kill内置的shell中,总是可以kill -s TSTP 0代替使用。


4
您可以引用suspend的一个常见用法是:在bash(可能还有很多shell)中:当您启动一个长命令时,不想中断它,但希望您在后台执行此操作(即,您想要command .... &但忘记了&,现在希望您可以在不中断命令的情况下添加它):您可以:ctrl-z,然后键入:bg在后台继续执行最新的挂起任务。(或bg %n使用任务号执行此操作njobs用于获取已暂停或正在运行的任务的列表)
Olivier Dulac

5
@OlivierDulac,不会解释实际suspend 命令的用途。
通配符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.