バックグラウンドでプロセスを続行するには、1回のキープレスでCtrl-Zとbgを実行するにはどうすればよいですか


25

タスクを中断し、Ctrl-Z bgシーケンスを頻繁に継続させるというこのパターンに従います。

私はそれを単一のキープレスに圧縮する方法があるのだろうかと思っていましたか?

私の貝は zsh


おそらくハードコーディングされていると言いたいです。しかし、私は100%ではありません
チャドハリソン

確かにそうですが、エレガントな解決策を見つけました。ありがとうございますsuperuser.com/a/161922/35223
エフゲニー・ドルジェンコ

回答:


24

Ctrl+のZシーケンスは、端末によってではなく、シェルによって処理されます。(有用な背景:「端末」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?

端末のキーにバインドできるのは、拡張可能でない小さな関数セットのみです。これらの機能にバインドされたキーカスタマイズできますが、別の機能を追加することはできません。これらの関数は3つのカテゴリに分類されます。

  • 独自に提供しないプログラムのコマンドラインエディション(正規モード、クックモードとも呼ばれる(rawモードとは反対)、実際にはほとんど使用しない):ファイルの終わり(eofCtrl+ D)、行の終わり(eolCtrl+ M)、文字を左に消去(eraseCtrl+ H)、単語を左に消去(weraseCtrl+ W)、行を消去(killCtrl+ U)。
  • 手動フロー制御:stopCtrl+ S)、startCtrl+ Q)。端末がコンピュータに追い付かない場合、またはその逆の場合に文字をドロップした古いシリアル端末でのみ有用です。
  • シグナル:割り込み(intrCtrl+ C)、強制終了(quitCtrl+ \)、中断(Ctrl+ Z)。

Linuxを含む一部のシステムはそのリストを拡張していますが、バックグラウンドを含むものは見たことがありません。カーネルのターミナルドライバーとターミナルエミュレーターの両方でサポートが必要になることに注意してください。そのため、フォアグラウンドジョブにSIGTSTPシグナルを送信するサスペンドに対処する必要があります。これにより、フォアグラウンドジョブのリーダー(通常はシェル)の親プロセスでSIGCHLDがトリガーされます。シェルはSIGCHLDを受信すると、waitpid通知された理由を調べるために呼び出し、バックグラウンドジョブが中断されたことを検出すると、通知(例[1] + 12345 suspended mycommand)と新しいプロンプトを表示します。

シェルをプログラムしSIGCONTて、フォアグラウンドジョブに信号を送信できます。zshがそのためのフックを持っているとは思わないので、ソースコードにパッチを当てる必要があります。そして、zshがあなたが本当にプログラムを中断するつもりなのか(おっと、このプログラムは間違ったことをしているのかもしれません。整理中に中断させてください)かバックグラウンドにするかを知る方法はありません。


私がしていることは、現在のジョブをバックグラウンドにするためにzshでCtrl+ Zキーシーケンスを設定することです(%%)。そうすれば、Ctrl+ Z Ctrl+を押すことで、フォアグラウンドジョブをバックグラウンドに送信できますZ。私はそれでだが、私は作るCtrl+ Z現在の入力行が空でないとき(私は、サブプロセスから戻ってきていないので)他の有益な何かを:私は別のコマンドを入力することができ、現在の入力行を「サスペンド」 、その後、中断された行が入力バッファにプッシュバックされます。

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

ジル、これは信じられないほど完全で、教育的で思慮深い答えです。どうもありがとうございます!
エフゲニー・ドルジェンコ

2

^ z ^ zは上記のzshのようにbashで使用できますが、少し気味が悪く、これを長い間実行していません。

  • .inputrcにマッピングを含めます "\C-z": "bg\n"
  • PS0 bash変数には、「$(stty susp ^ z)」を含めます
  • PROMPT_COMMAND bash変数に「stty susp ^ @」を含めます

そのため、コマンドの実行時にサスペンドの^ zがオンになり、次にbashプロンプトでオフになります。


1

だから、私が望むものではなく、ここから近い解決策を見つけました/superuser//a/161922/35223

空のコマンドラインでbgを実行します(Ctrl + Z Ctrl + Zでプログラムを中断し、すぐにバックグラウンドで再開します)。


これにはzshが必要であることに注意してください。bashではサポートされていません。(とにかく箱から出して)
ケビンM

@KevinM同様の関数をbashで書くことができます(少なくともCtrl+Z呼び出しを行う基本バージョンではbg、空でない入力行を検出するかどうかはわかりません)。
ジル 'SO-悪であるのをやめる

0

これらのコマンドは、最初にフォアグラウンドで実行してからバックグラウンドに切り替えたいですか?もっと簡単な方法があるかどうかはわかりません。ただし、最初からバックグラウンドで実行されるコマンドを実行する場合は、行末にアンパサンドを追加するだけです。たとえば、ping google.com &バックグラウンドでpingを開始します。を入力しない限り、操作することはできませんfg


1
おかげで、問題は、コマンドの実行にどれだけ時間がかかるかわからない場合があるため、対話的に実行してから、バックグラウンドで実行し続けるほうがよいことに気づくということです。受け入れられた答えは、私にとっては驚くほどうまく機能し、毎日使用しています!
エフゲニー・ドルジェンコ

回答ありがとうございます。受け入れられた答えはとてもきれいです!
octern
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.