私と同じ端末を開くとxterm
シェルができます。その後、ssh
orを使用すると、zsh
別の「レベル」のシェルが作成されます。すべての項目を終了する前にCtrl+D
何回入力する必要があるかを知る方法はありますか?exit
私の本当の意図は、「ルート」シェルを除くすべてを終了することです。
ターミナルマルチプレクサ(例screen
:)がソリューションにどのような影響を与えるかを知ることもお勧めします。
PS:タイトルを自由に変更してみてください。これが正しいかどうかわかりません。
ベストアンサー1
実際、あなたは正しい用語を見つけました。SHLVL
すべての主要な対話型シェル(bash、tcsh、zsh)には、起動時に1ずつ増加する環境変数があります。したがって、シェルがシェル内で始まると、SHLVL
1ずつ増加します。
SHLVL
しかし、ターミナルエミュレータのようなものが継承されるので、これはあなたの懸念に直接答えることはありません。たとえば、一般的な構成では、xtermの値は2です。これは、レベル1が$SHLVL
Xセッションを実行しているシェル(~/.xinitrc
またはシェル)に対応するためです~/.xsession
。
$SHLVL
私がすることはプロンプトに表示することです。ただし、シェルの親プロセスが別のシェルの場合にのみ表示されます(「sh
名前がオプションの句読点と数字で終わる場合はシェルです」などの経験的な方法を使用)。これにより、あるシェルが別のシェルの下で実行されるまれな場合に、明確な視覚的表示を得ることができます。
たぶん、端末エミュレータで直接実行されるシェルを検出したいと思うかもしれません。これを非常に正確に実行できます。これらのシェルの親プロセスには異なる制御端末があり、異なる出力をps -o tty= -p$$
生成しますps -o tty= -p$PPID
。これらのシェルで手動で1にリセットするSHLVL
か、これらのシェルで一意の値をTERMSHLVL
1(そうでない場合は増分)に設定できます。
1
マニュアルページを見るとそうは思わないかもしれませんが、それをサポートする3つのシェルの.NETドキュメントには「level」という言葉は含まれていませんSHLVL
。