web-dev-qa-db-ja.com

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

私はこのパターンのタスクを一時停止し、それを頻繁に続行させて Ctrl-Zbg シーケンス。

それを単一のキープレスに圧縮する方法はありますか?

私のシェルはzshです

26

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

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

  • 独自のものを提供しないプログラムのコマンドラインエディション(正規モード、クックモードとも呼ばれます(ローモードでは反対)):ファイルの終わり(eof、 Ctrl+D)、行末(eol、 Ctrl+M)、左の文字を消去(erase、 Ctrl+H)、残った単語を消去(werase、 Ctrl+W)、行を消去(kill、 Ctrl+U)。
  • 手動フロー制御:stopCtrl+S)、startCtrl+Q)。端末がコンピュータに追いつけない、またはその逆の場合に文字を落とした古いシリアル端末でのみ役立ちます。
  • シグナリング:割り込み(intr、 Ctrl+C)、強制終了(quit、 Ctrl+\)、 サスペンド (Ctrl+Z)。

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

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


私がやっていることは Ctrl+Z 現在のジョブ(%%)。そのようにして、私は押すことによってフォアグラウンドジョブをバックグラウンドに送ることができます Ctrl+ZCtrl+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

上記のzshのような^ z ^ zはbashで可能ですが、少し扱いに​​くいため、これを長い間実行していません。

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

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

3
JohnLittle

だから、解決策を見つけました、私が正確に望んでいるものではありませんが、ここから近いです https://superuser.com/a/161922/3522

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

1

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

0
octern