私はこのパターンのタスクを一時停止し、それを頻繁に続行させて Ctrl-Zbg シーケンス。
それを単一のキープレスに圧縮する方法はありますか?
私のシェルはzsh
です
の Ctrl+Z シーケンスはシェルではなく端末によって処理されます。 (便利な背景: 「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか? )
functions の小さくて拡張不可能なセットのみが 端末のキーにバインドされます になります。 キーをカスタマイズ これらの関数にバインドできますが、別の関数を追加することはできません。これらの関数は3つのカテゴリに分類されます。
eof
、 Ctrl+D)、行末(eol
、 Ctrl+M)、左の文字を消去(erase
、 Ctrl+H)、残った単語を消去(werase
、 Ctrl+W)、行を消去(kill
、 Ctrl+U)。stop
(Ctrl+S)、start
(Ctrl+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で可能ですが、少し扱いにくいため、これを長い間実行していません。
"\C-z": "bg\n"
を含めますそのため、コマンドの実行時にサスペンドの^ zがオンになり、bashプロンプトではオフになります。
だから、解決策を見つけました、私が正確に望んでいるものではありませんが、ここから近いです https://superuser.com/a/161922/3522
空のコマンドラインでbgを実行します(Ctrl + Z Ctrl + Zはプログラムを中断し、すぐにバックグラウンドで再開します)。
これらのコマンドを最初にフォアグラウンドで実行してから、バックグラウンドに切り替えたいですか?もっと簡単な方法があるかどうかはわかりません。ただし、最初にバックグラウンドで実行されるコマンドを実行する場合は、行の最後にアンパサンドを追加するだけです。例:ping google.com &
はバックグラウンドでpingを開始します。 fg
を入力しない限り、これを操作することはできません。