web-dev-qa-db-ja.com

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

適用可能なBashのmanページの全部分は、次のように述べています。

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

使ったことがない Ctrl-Y;私はそれについて学んだだけです。私はうまくやった Ctrl-Z (一時停止)のみ。

このオプションがforとは何かを想像しようとしています。いつ役立つのでしょうか?

(この機能はすべてのUnixバリアントには存在しないことに注意してください。 Solaris およびOpenBSDには存在しますが、LinuxまたはFreeBSDには存在しません。対応する設定はstty dsuspです。)

多分主観的ではない:で達成できることはあるか Ctrl-Y それは簡単には達成できません Ctrl-Z

31
Wildcard

cshの4BSDマニュアル から:

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

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

23
Random832

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

11
user147505

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

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

read fooファイルが書き込まれた後(クリーンアップの前)、スクリプトを実行し、 Ctrl-Y 彼らが生成されているように。その後、必要な処理を行うためにスクリプトがバックグラウンドで中断された状態でプロンプトに移動し、fgを実行してスクリプトを完了できます。

4
DopeGhoti

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

2
Olaf Seibert