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

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

私と同じ端末を開くと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

答え2

(完璧ではありませんが)1つの方法は、結果をps --no-headers -o comm $PPIDシェルプロンプトに追加することです。これは、シェルを作成したプロセスの名前を示します。入れ子になったzshにある場合は、「zsh」と表示されます。トップレベルのzshにある場合は、「xterm」または「screen」、またはシェルが実行されているすべての項目が表示されます。

現在sshセッションにあるかsuセッションにあるかを確認するには、プロンプトのホスト名とユーザー名の部分を調べます。

入れ子になった画面を実行するとき(通常の場合ではないようです)、入れ子になった画面の最上位シェルにあるのか、最上位画面の最上位シェルにあるのかはわかりません。 。常にステータス行を表示するように画面を設定できます。これにより、入れ子になった画面にいる場合は複数のステータス行が表示されます。

答え3

とてもエレガントではありませんが、使えますツリービュー存在するトップシェルと他の実行中のプロセス間の親と子の関係を表示します。

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

これを使用して、「ルート」シェルに到達する前にシャットダウンする必要があるシェルの数を推定します。

答え4

私が見つけた

$ pstree -u | grep ${USER}

システム内で私が「適合」した場所を理解するのに非常に役立ちます。私はそれを好むpstree -u ${USER}

nohup時々私は仕事をやめたり、そのようなことを思い出したりします。

(また使用しますalias grep='grep --color=auto'。)

関連情報