自分がいるシェルの「レベル」を知る方法は?


32

このようxtermにターミナルを開くと、シェルができます。次に、使用するsshか、zsh別の「レベル」のシェルを使用します。それらをすべて終了するために何回Ctrl+D入力exitする必要があるかを知る方法はありますか?私の本当の意図は、「ルート」シェル以外のすべてを終了することです。

また、端末マルチプレクサ(などscreen)がソリューションにどのような影響を与えるかを知っておくと便利です。

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

回答:


6

1つの(明らかに完全ではない)方法はps --no-headers -o comm $PPID、シェルプロンプトに結果を追加することです。これにより、シェルを生成したプロセスの名前がわかります。ネストされたzsh内にいる場合、「zsh」と表示されます。トップレベルのzsh内にいる場合、「xterm」または「screen」、またはシェルが実行されているものは何でも読み取ります。

sshまたはsuセッション内にいるかどうかを確認するには、プロンプトのホスト名とユーザー名の部分を見るだけです。

ネストされた画面を実行しているとき(これは一般的な状況だとは思いません)、ネストされた画面のトップレベルのシェルにいるのか、トップレベルのシェルにいるのかを判断する方法はありませんトップレベル画面の。常にステータス行を表示するように画面を構成できます。これにより、ネストされた画面にいる場合、複数のステータス行が表示されます。


あぁ…スナップ。:) +1
ステファン

現在、私はMacを使用していますが、コマンドは私ps: illegal option -- -に与えました、理由は何ですか?すぐにLinuxでもう一度テストします:)
phunehehe

3
@phunehehe:--option-nameほとんどがGNU固有の機能であるため、Linux以外の標準システムユーティリティではほとんど利用できません。ただし、列名の後にps --no-headers追加することにより、移植性のある効果を得ることができます=。また、comm列はPOSIXではなく、cmd列(コマンドの引数を含む)です。また、-pPOSIX構文でPIDの前に必要です。したがってps -o cmd= -p $PPID、移植性があり、同様の情報を提供します。
ジル「SO-悪であるのをやめる」

確認し、Gentooの上で動作します
phunehehe

2
@phunehehe:申し訳ありませんが、上記のコメントを間違えました。実際、このcomm列はPOSIXによって指定され、Mac OS Xで文書化されていcmdますが、Linuxには存在しますが標準ではありません。
ジル「SO-悪であるのをやめる」

37

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

ただし、SHLVLターミナルエミュレーターなどを引き継いでいるので、これは懸念に直接答えません。たとえば、私の典型的な構成で$SHLVLは、レベル1はXセッション(~/.xinitrcまたは~/.xsession)を実行するシェルに対応するため、xtermで2 です。

$SHLVLシェルの親プロセスが別のシェルである場合にのみ、プロンプトに表示します(「名前がshオプションの句読点と数字で終わる場合、それはシェルです」などのヒューリスティックを使用)。そうすれば、シェルが別のシェルの下で実行されているという珍しいケースで、視覚的に明確な兆候がわかります。

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

¹ マニュアルページを見るとは思わないでしょうが、それをサポートする3つのシェルはいずれも、ドキュメントの「レベル」という単語を含んでいませんSHLVL


期間を確認していただきありがとうございます。私はまだMacを使用していますが、シェルレベルに関係なく、これら2つのコマンドが同じ結果をもたらすことに驚いています。
プネヘヘ

@phunehehe:2つのコマンドは何ですか?あなたが意味する場合はps -o tty= -p$pid、このショーのプロセスの制御端末エミュレータを識別する、端末(xterm、スクリーン、SSHD、...)プロセスが実行されていること。それはあなたが別のシェルからシェルを起動した場合に変更されることはありませんが、あなたも変わります新しいターミナルエミュレータを起動します。ターミナルエミュレータがネイティブのMacアプリケーションである場合、Mac固有の微妙な点に気付いていない可能性があります。
ジル 'SO-悪であるのをやめる'

ps -o tty= -p$$ そしてps -o tty= -p$PPID 、あなたは彼らが異なる出力を生成するべきだと言ったからです。または、私は何かを誤解しましたか?
プネヘヘ

@phunehehe:シェルの親プロセスが端末エミュレーターである場合、端末エミュレーターには制御端末としてエミュレートされた端末がないため、異なる出力を提供します。そうでない場合は、ps -p $$ -p $PPID(ここでもOSXの経験がないので、OSXで何か異常なことが起こっているかもしれません)の出力を投稿してください。
ジル「SO-悪であるのをやめる」

@Gilles:それは確かにOSXでは珍しいことでした。私はGentooでテストしたが、あなたが言ったようにすべてが正しかった。OSXで、ps -p $$ -p $PPID(コメントのフォーマット方法がわかりません)PID TTY TIME CMD 209 ttys000 0:00.01 login -pf phunehehe 210 ttys000 0:00.12 -bash
phunehehe

1

あまりエレガントではありませんが、htopのツリービューを使用して、シェルと他の実行中のプロセスとの親子関係を確認できます。

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

そして、これを使用して、「ルート」シェルに到達する前に、終了する必要があるシェルの量を推測します。


1

環境変数SHLVLを使用できます。

echo "$SHLVL"

1
sshたとえば、同じアカウントに使用する場合、これは引き続き1
-Anthon

0

それみつけたよ

$ pstree -u | grep ${USER}

システムのどこに「適合する」かを確認するのに非常に役立ちます。私はそれを好むpstree -u ${USER}

時折、それは私がnohup仕事をしているか、または同様の仕事を辞めたことを思い出させます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.