web-dev-qa-db-ja.com

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-NRと入力すると、凍結されたターミナルにSIGCONT信号が送信され、解凍されて凍結されなくなります。

しかし、端末を一時停止する実際の目的は何ですか?毎日のアプリケーションはどれが典型的ですか?シェルを組み込みにした人々は何を考えていましたか?

22
sharkant

別のシェルからシェルを起動する場合は、内側のシェルを一時停止できます。 suを使用していて、しばらくの間通常のユーザーに切り替えたい場合は次のようにします。

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

(これを行う場合は、特権シェルがバックグラウンドで開いていることを忘れないでください...)

同様に、他のプログラム(!コマンド。 less)、シェルを一時停止できます。しかし、他の多くのプログラムがサブプロセスを起動し、それがそれ自体を中断するとき、それをうまく処理することを期待しません。

23
ilkkachu

それは押すのと同じです 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年代前半のcsh、BSDのシェル(ジョブ制御の由来) に由来します

AT&T kshでは、これはkill -s STOP $$の組み込みエイリアスです( はい、引用符はありません!

あなたの場合、bashはおそらくターミナルエミュレーターによって直接開始されたものです。また、ターミナルエミュレータは、プロセスが中断されることを予期していませんでした。

そのbashはセッションリーダーでした。セッションリーダーが一時停止されている場合、旧式の端末を見ると、ユーザーはそれを再開する方法がありません。

bashは、ログインシェルの場合はsuspendを拒否することで対処します。しかし、あなたのケースでは、端末エミュレータはおそらくログインモードでbashを起動しないため、安全対策が講じられていません。

zshmkshSIGTSTP(これも Ctrl+ZSIGSTOPの代わりにcshのようなシグナル(およびcshのようにmkshの呼び出し元のプロセスグループに、_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

これは、SIGTSTPを呼び出し元ではなくメインプロセスグループに送信するzshでは機能しません。 killが組み込まれているシェルでは、代わりに常にkill -s TSTP 0を使用できます。

25