私が属するシェルの「レベル」をどうやって知ることができますか?

私が属するシェルの「レベル」をどうやって知ることができますか?

私と同じ端末を開くとxtermシェルができます。その後、sshorを使用すると、zsh別の「レベル」のシェルが作成されます。すべての項目を終了する前にCtrl+D何回入力する必要があるかを知る方法はありますか?exit私の本当の意図は、「ルート」シェルを除くすべてを終了することです。

ターミナルマルチプレクサ(例screen:)がソリューションにどのような影響を与えるかを知ることもお勧めします。

PS:タイトルを自由に変更してみてください。これが正しいかどうかわかりません。

ベストアンサー1

実際、あなたは正しい用語を見つけました。SHLVLすべての主要な対話型シェル(bash、tcsh、zsh)には、起動時に1ずつ増加する環境変数があります。したがって、シェルがシェル内で始まると、SHLVL1ずつ増加します。

SHLVLしかし、ターミナルエミュレータのようなものが継承されるので、これはあなたの懸念に直接答えることはありません。たとえば、一般的な構成では、xtermの値は2です。これは、レベル1が$SHLVLXセッションを実行しているシェル(~/.xinitrcまたはシェル)に対応するためです~/.xsession

$SHLVL私がすることはプロンプトに表示することです。ただし、シェルの親プロセスが別のシェルの場合にのみ表示されます(「sh名前がオプションの句読点と数字で終わる場合はシェルです」などの経験的な方法を使用)。これにより、あるシェルが別のシェルの下で実行されるまれな場合に、明確な視覚的表示を得ることができます。

たぶん、端末エミュレータで直接実行されるシェルを検出したいと思うかもしれません。これを非常に正確に実行できます。これらのシェルの親プロセスには異なる制御端末があり、異なる出力をps -o tty= -p$$生成しますps -o tty= -p$PPID。これらのシェルで手動で1にリセットするSHLVLか、これらのシェルで一意の値をTERMSHLVL1(そうでない場合は増分)に設定できます。

1 マニュアルページを見るとそうは思わないかもしれませんが、それをサポートする3つのシェルの.NETドキュメントには「level」という言葉は含まれていませんSHLVL

おすすめ記事