回答:
1つの(明らかに完全ではない)方法はps --no-headers -o comm $PPID
、シェルプロンプトに結果を追加することです。これにより、シェルを生成したプロセスの名前がわかります。ネストされたzsh内にいる場合、「zsh」と表示されます。トップレベルのzsh内にいる場合、「xterm」または「screen」、またはシェルが実行されているものは何でも読み取ります。
sshまたはsuセッション内にいるかどうかを確認するには、プロンプトのホスト名とユーザー名の部分を見るだけです。
ネストされた画面を実行しているとき(これは一般的な状況だとは思いません)、ネストされた画面のトップレベルのシェルにいるのか、トップレベルのシェルにいるのかを判断する方法はありませんトップレベル画面の。常にステータス行を表示するように画面を構成できます。これにより、ネストされた画面にいる場合、複数のステータス行が表示されます。
ps: illegal option -- -
に与えました、理由は何ですか?すぐにLinuxでもう一度テストします:)
--option-name
ほとんどがGNU固有の機能であるため、Linux以外の標準システムユーティリティではほとんど利用できません。ただし、列名の後にps --no-headers
追加することにより、移植性のある効果を得ることができます=
。また、comm
列はPOSIXではなく、cmd
列(コマンドの引数を含む)です。また、-p
POSIX構文でPIDの前に必要です。したがってps -o cmd= -p $PPID
、移植性があり、同様の情報を提供します。
comm
列はPOSIXによって指定され、Mac OS Xで文書化されていcmd
ますが、Linuxには存在しますが標準ではありません。
実際、正しい用語を見つけました¹。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
。
ps -o tty= -p$pid
、このショーのプロセスの制御端末エミュレータを識別する、端末(xterm、スクリーン、SSHD、...)プロセスが実行されていること。それはあなたが別のシェルからシェルを起動した場合に変更されることはありませんが、あなたも変わります新しいターミナルエミュレータを起動します。ターミナルエミュレータがネイティブのMacアプリケーションである場合、Mac固有の微妙な点に気付いていない可能性があります。
ps -o tty= -p$$
そしてps -o tty= -p$PPID
、あなたは彼らが異なる出力を生成するべきだと言ったからです。または、私は何かを誤解しましたか?
ps -p $$ -p $PPID
(ここでもOSXの経験がないので、OSXで何か異常なことが起こっているかもしれません)の出力を投稿してください。
ps -p $$ -p $PPID
(コメントのフォーマット方法がわかりません)PID TTY TIME CMD 209 ttys000 0:00.01 login -pf phunehehe 210 ttys000 0:00.12 -bash