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信号を入力すると、フリーズされたターミナルに送信されて解凍され、フリーズが解除されます。

しかし、端末を一時停止する実際の目的は何ですか?毎日どのアプリケーションが一般的ですか?それをシェルビルトインにした人々は何を念頭に置いていましたか?


2
一時停止のために外部プログラム(kill)を実行しないでください。
IPOR Sircer

回答:


23

別のシェルからシェルを開始する場合、内側のシェルを中断できます。を使用しているときsuに、しばらくの間通常のユーザーに切り替えたい場合:

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

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

同様に、他のプログラム(!例えばのコマンドless)からシェルにエスケープした場合でも、シェルを一時停止できます。しかし、他の多くのプログラムがサブプロセスを起動したときにうまく処理するとは思わないでしょう。


1
を実行vimしてみ:shましたが、サブシェル(具体的にはzshサブシェル)を取得するために実行しました。実行suspendすると、元のシェルにポップされました(サブシェルとvimの両方を中断しました)。
ケビン

1
@Kevin、zshより賢いようですbash、私は両方から脱出しようlessとしましたvi(Debianのものvim.tiny):zsh親アプリも停止しbash、すべてをハングさせました。bashでもbash動作します。
-ilkkachu

1
サブシェルでsudo suと入力するのが開始されることを知りませんでした。メインシェルでサスペンドを入力すると、シェルは単にフリーズしますが、どのようにサブシェル内でサスペンドすると、自動的にメインシェルに戻ります。
-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はセッションリーダーでした。セッションリーダーが中断されている場合、古い時間の端末を見ると、ユーザーはそれを再開することができません。

bashsuspendログインシェルであるかどうかを拒否することで対処します。しかし、あなたの場合、ターミナルエミュレータはおそらくbashログインモードで起動しないので、そのための安全対策は整っていません。

zshそしてmksh、彼らが送るので問題ありませんSIGTSTP(また時に送られた1 Ctrl+Z)の代わりに、CSHのような信号SIGSTOPのための(呼び出し側のプロセスグループへmkshのためのシェルのメインプロセスグループにCSHのように、とはzsh、いない$$だけではプロセス)。SIGTSTP孤立したプロセスグループに配信された場合は無視され、リーダーのグループが資格を得ます。SIGTSTPは、ユーザーが再開できないものを一時停止するべきではないという考え方です。

ではmkshまたはyash、1にも使用することができ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代わりにいつでも使用できます。


4
サスペンドの一般的な用途は次のとおりです:bash(およびおそらく多くのシェル):長いコマンドを開始し、それを中断したくないが、バックグラウンドでそれをしたかったとき(つまり、あなたがしたいcommand .... &がを忘れてしまった&ので、コマンドを中断せずに追加できることを望みます):することができます:ctrl-zそして、入力して:bgバックグラウンドで最新の中断されたタスクを再開します。(またはbg %n、タスク番号をn使用してこれを行います。jobs中断または実行中のタスクのリストを取得するために使用します)
オリビエデュラック

5
@OlivierDulac、それは実際のsuspend コマンドの目的を説明しません。
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.