Bashで遅延サスペンド(Ctrl-Y)の目的は何ですか?


30

Bashのマニュアルページの該当部分のみに次のように記載されています。

bashが実行されているオペレーティングシステムがジョブ制御をサポートしている場合、bashにはそれを使用する機能が含まれています。プロセスの実行中に中断文字(通常^ Z、Control-Z)を入力すると、そのプロセスが停止し、制御がbashに戻ります。 遅延サスペンド文字(通常^ Y、Control-Y)を入力すると、端末から入力を読み取ろうとするとプロセスが停止し、制御がbashに戻ります。 その後、ユーザーはbg コマンドを使用してバックグラウンドでジョブを続行し、このジョブの状態を操作できます。fgフォアグラウンドでそれを続行するコマンド、またはそれを強制終了するkillコマンド。^ Zはすぐに有効になり、保留中の出力と先行入力が破棄されるという追加の副作用があります。

私は一度も使用したことがありませんCtrl- Y; 私はそれについて学んだだけです。私は罰金を行っているCtrl- Z(一時停止)のみ。

私は、このオプションが何であるかを想像しようとしていますのために。いつ役に立つでしょうか?

(この機能はすべてのUnixバリアントに存在するわけではありません。SolarisおよびFreeBSDには存在しますが、Linuxには存在しません。対応する設定はstty dsuspです。)

おそらく少ない主観:で実現することができるものありますCtrl- Yと同じように簡単に行うことができませんかCtrl- Z


@Gillesは、FreeBSDにを持っているようですが、stty dsusp^ YにSIGTSTPを送信させることができませんでした(Solarisで行いました)。あなたは?
ステファンシャゼル

回答:


23

csh4BSDマニュアルから:

Aは^Zすぐに有効になり、それが入力されたときに保留中の出力および未読の入力中に割り込みが破棄されているようなものです。^Yプログラムが読み取りを試みる(2)までSTOPシグナルを生成しない特別なキーがもう1つあります。これは、ジョブの読み込み後に停止するジョブのコマンドを準備しているときに、便利に入力できます。

そのため、最初の入力が処理されている間に複数の入力を入力し、完了後にジョブを停止することが目的です。


この説明はbashマニュアルとは微妙に異なります。 「...プログラムが読み取ろうとするまでSTOPシグナルを生成しません 入力ストリームのすべてが正常に読み取ら、ヒットするとプロセスが停止するようです。私はこれを読んでいますか?^Y^Y
ワイルドカード

Mac OS Xでの私のテストの@Wildcardでは、read()が返る前に(ただし、Y 返すread()の呼び出し後に)プロセスが停止し、再開後に^ Yの前から入力を受け取ります。ただし、これは使用することを目的としていたため、行の先頭で使用されるため、この場合の動作は問題になりません。実際のコードでは、^ Yがユーザープロセスの読み取りバッファーにコピーされたときに中断されていると思われます。
Random832

私は正しかった、元のBSDカーネルのttread関数でこれを見ることができ、最新のOSX
Random832

ただし、プロセスが再開さ^Yれると、プロセスが拒否され、プロセスが再開される前に端末を閉じた場合でも、呼び出しは成功し、前に端末に入力したデータが含まれます。右?(「...再開された後、^ Yの前から入力を受け取ります。」 それは私が意図したことです。私は通常Cコードを扱いません。):)
ワイルドカード

はい。そして、最後に改行なしで戻ります。これは、標準モードでの読み取りでは珍しいことです(テキストを入力してから^ Dを1回押した場合と同じです)。行の先頭に入力するように意図されています。
Random832

11

入力を読み込んで実行するループがあるとします。タスクが新しいコマンドのコマンドラインに戻る前に中断することなく、タスクが計算する現在の命令を終了できるようにすると便利です。したがって、サイクルを終了します。これにより、ループが正常に終了しread、タイムアウト制限下にある場合にループが再度実行されなくなります。


しかし、端末とにかくから入力を読み取ろうとするために起こっている場合、それはなり停止し、その時点で(とあなたの入力待ち)、そしてあなたことができ^Z、それは、その後
ワイルドカード

はい。更新を参照してください。
トマス

もう一度確認してください。@ワイルドカード
トマス

1
しかし、タイムアウトが発生した場合、特別なことを何もしなかったとしても、優雅に終了しませんか?
ダニエルワーグナー

1
かもしれない。ただし、デフォルトのジョブを実行することもあります。
トマス

4

役に立つかもしれない1つのシナリオを考えることができますが、それは不自然なエッジケースのようなものです。

クリーンアップルーチンの一部として削除される前に分析したい一時ファイルを作成しているスクリプトをデバッグしているとします。

あなたは追加することができread foo、ファイルが書き込まれた後、どこかに(ただし、クリーンアップの前に)、スクリプトを実行し、キーを押しCtrl- Y彼らが生成されているよう。その後、スクリプトがバックグラウンドで中断された状態でプロンプトが表示され、必要なことを実行し、fgスクリプトの完了を許可できます。


1
とにかく、スクリプトは入力を待機するためです。したがって、入力を促すためにそれを簡単に監視し、で中断することができ^Zます。言い換えれば、あなたが入力した後fg、スクリプトにいくつかの入力を与える必要がありますとにかく、それが継続する前に。したがって、私の質問。私はまだ意味が分からない^Y。(しかし、答えてくれてありがとう!):)
ワイルドカード

2

私が考えることができる唯一のシナリオ(そして、私はそれを非常に説得力のあるものとは思わない)は、シェルコマンドに先行入力を使用したい場合です。将来、入力を読み取るコマンドが実行されているとします。次に、^ Yと入力して、実行中のコマンドが中断したときに実行する次のシェルコマンドをすぐに入力します。BSD Unixを使用して数十年にわたってこれを実際に使用したことはないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.