私はmacOS 12.4、Apple M1でzshを使用しています。
そのコマンドでhtopを正常に実行してhtop
使用すると、期待ctrl+z
どおりに実行され、プロセスがバックグラウンドで送信されます。コマンドを使用して再呼び出しfg
し、次のようにバックグラウンドに戻すことができます。ctrl+z
ただし、htopを実行してコマンドを使用してバックグラウンドに直接送信すると、
htop &
evokeを使用すると、もはや背景に送信されfg
なくなります。影響はありません。ctrl+z
ctrl+z
これが期待されるか。私が使ったときと同じ問題はありませんでしたvim &
。
答え1
Ubuntuhtop
はもちろんmutt
。
問題の原因は、zshの行エディタ(zle)が有効になっていると、ttyデバイスルールのすべてのVQUIT、VSUSP、VDSUSP、VSWTCH、VLNEXT特殊文字が無効になるため、Ctrl+を押すとZzleが^Z
システムからメッセージを送信しようとする試みを受け取ることです。 。 SIGTSTP(VSUSP設定)をフォアグラウンドプロセスグループに変更します。
あなたは見ることができますそこコードから。
zshが行エディタを離れてコマンドを実行すると(またはジョブをフォアグラウンドに戻すと)、端末の状態が復元されます(以前と^Z
同様にSUSPの復元を含む)。
TUIアプリケーションを起動すると、バックグラウンドで初期化が進行中htop &
にラインエディタにすぐに再入力されます(プロンプトに戻ります)。htop
htop
ncurses アプリケーションは通常 zle と同じことを行います。つまり、初期tty設定を検索し、目的に合わせて変更し、終了(または一時停止)時に保存されたtty設定を復元します。
これで問題は、バックグラウンドで起動したときにncursesアプリケーションによって取得された初期のtty設定がzleによって設定された設定であり、通常の設定ではないことです。初期化時に既にプロンプトに戻ってきたからです。したがって、現在のSUSPは無効になっているとマークされます。
設定を変更しようとすると(SUSP設定以外の内容が変更される)、フォアグラウンドにないため、SIGTTOUにより一時停止します。
その後fg
、zshはSIGCONTをアプリケーションに送信する前にtty設定を再び正常に戻します。ただし、アプリケーションはtcsetattr()
初期設定の上に変更を適用する設定に戻り、無効な一時停止を再適用します。
私が実行した場合:
stty -a < /dev/pts/1
(/dev/pts/1
私の場合はttyがhtop
接続され復元されました)
わかります:
intr = ^C; quit = <undef>; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = ^R; werase = ^W;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
したがって、htop
SIGTSTPの影響を受けない、またはhtop
フォアグラウンドで正しく機能しないのではなく、その端末にSIGTSTPを送信する文字がないことです。
私が次htop
のように始めた場合:
htop & sleep 1
その後、初期設定を検索すると、プロンプトはまだ実行中であるため、htop
プロンプトに戻ることはなく、履歴書を使用しても一時停止できます。sleep
htop
^Z
独自の行エディタでSUSPを無効にすると同じ動作が発生しますtcsh
が、readlineを使用するbashや他のシェル、またはテストした他の多くのシェルではそうではありません。つまり、^Z
独自の行エディタにバインドできません。そのうちのいくつかは、いくつかの特別な設定が無効になっています。たとえば、bashはLNEXT(通常^V
)を無効にします。