プロセスをバックグラウンド設定$に送信するのはなぜですか?ゼロ以外の値ですか? [コピー]

プロセスをバックグラウンド設定$に送信するのはなぜですか?ゼロ以外の値ですか? [コピー]

前のプロセスをバックグラウンドに送信すると、変数がゼロ以外の値にCtrl-Z設定されていることがわかりました。$?なぜですか?

コマンドが間違っていると色が変わるターミナルプロンプトが欲しいので、この動作は私を悩ませます。私は次のことをしました。この回答。しかし、これはVimで作業している場合、Vimを背景に送信するたびに、Ctrl-Z何か間違っているかのようにプロンプ​​トの色が変わるという意味でもあります。

答え1

(仮説bash

Ctrl-Zはプロセスをバックグラウンド(元bg %JOB_NUMBER)に送信しません。停止するそれ。これを行うには、SIGSTP信号がプロセスに送信されます(直接実行できますkill -SIGSTP PID)。 SIGSTPはシグナル20です。

表示される戻り値は次のとおりです。148または128 + SIGSTP

したがって、条件を確認するには、その回答のコードを変更する必要があり、常に148になります。

答え2

現在報告されている問題は、$?プログラム終了の原因を判別できないアンティークを使用して情報が失われて発生した問題です。

$?exit()プログラムが見つからない場合、ファイルは見つかりますが実行できない場合、または+プログラムがシグナルで終了した場合は、プログラムコードの下位8ビットを含みます。シェルに依存する数字(通常128、256、または512)。127126basesignal numberbase

126、127の値、または129..192の範囲の数値を保存すると、これがサブコードなのか、信号によるコードなのか、エラーによるものなのかは$?わかりません。exit()exec()

$?また、少数の信号にのみ標準化された数値が与えられるため、数値は部分的にオペレーティングシステムによって異なります。SIGTSTP数字が指定されていないシグナルの場合、$?その数字が死亡シグナルからのものであると仮定してシグナル名を取得する方法がまだあります。

次の例を確認してください。

$ sleep 100^Z
$ echo $?
152
$ kill -l 152
TSTP

kill -lfrom 値は、現在のオペレーティングシステムで指定されたシグナルの値とシグナル番号に関係なく、すべての$?シェルに適用されます。POSIXbase

ユーザーフレンドリーなシェル(例:)を使用している場合boshだけでなく、$?次の例を見てください。

$ sleep 100^Z
$ echo ${.sh.codename} ${.sh.termsig} ${.sh.status} $/ $?
KILLED TSTP 24 TSTP 152
$ (exit 1234567890)
$ echo ${.sh.codename} ${.sh.termsig} ${.sh.status} $/ $?
EXITED UNKNOWN 1234567890 1234567890 210

${.sh.codename}リスト内の子供の死亡原因名EXITED KILLED DUMPED TRAPPED STOPPED CONTINUED NOEXEC NOTFOUND

${.sh.termsig}ステータスコードに関連付けられた信号名。

${.sh.status}数値ステータスコードです。

上記の3つの変数はbosh具体的です。

$/プログラムが正常に終了したときの数字とシグナルまたはまたはテキストを含む後続のプログラムPOSIXの現在の推奨事項です。$?NOEXECNOTFOUND

私の例では、互換性のあるオペレーティングシステムexit()でのみ機能するPOSIX32ビットコードを使用しています。値は210式の結果です1234567890 & 0xFF

関連情報