タスクを中断し、Ctrl-Z bgシーケンスを頻繁に継続させるというこのパターンに従います。
私はそれを単一のキープレスに圧縮する方法があるのだろうかと思っていましたか?
私の貝は zsh
タスクを中断し、Ctrl-Z bgシーケンスを頻繁に継続させるというこのパターンに従います。
私はそれを単一のキープレスに圧縮する方法があるのだろうかと思っていましたか?
私の貝は zsh
回答:
Ctrl+のZシーケンスは、端末によってではなく、シェルによって処理されます。(有用な背景:「端末」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?)
端末のキーにバインドできるのは、拡張可能でない小さな関数セットのみです。これらの機能にバインドされたキーをカスタマイズできますが、別の機能を追加することはできません。これらの関数は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があなたが本当にプログラムを中断するつもりなのか(おっと、このプログラムは間違ったことをしているのかもしれません。整理中に中断させてください)かバックグラウンドにするかを知る方法はありません。
私がしていることは、現在のジョブをバックグラウンドにするために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
だから、私が望むものではなく、ここから近い解決策を見つけました/superuser//a/161922/35223
空のコマンドラインでbgを実行します(Ctrl + Z Ctrl + Zでプログラムを中断し、すぐにバックグラウンドで再開します)。
Ctrl+Z
呼び出しを行う基本バージョンではbg
、空でない入力行を検出するかどうかはわかりません)。
これらのコマンドは、最初にフォアグラウンドで実行してからバックグラウンドに切り替えたいですか?もっと簡単な方法があるかどうかはわかりません。ただし、最初からバックグラウンドで実行されるコマンドを実行する場合は、行末にアンパサンドを追加するだけです。たとえば、ping google.com &
バックグラウンドでpingを開始します。を入力しない限り、操作することはできませんfg
。