あなたの質問を読んだとき、私の最初の考えはでした$SHLVL。それから、シェルレベルに加えてvimレベル
 をカウントしたいことがわかりました。これを行う簡単な方法は、シェル関数を定義することです:
vim()  { ( ((SHLVL++)); command vim  "$@");}
これはSHLVL
、vimコマンドを入力するたびに自動的かつサイレントにインクリメントします。これは、使用するvi/の各バリアントに対して行う必要がありvimます。例えば、
vi()   { ( ((SHLVL++)); command vi   "$@");}
view() { ( ((SHLVL++)); command view "$@");}
括弧の外側のセットはサブシェルを作成するため、値を手動で変更してもSHLVL
、現在の(親)シェル環境は汚染されません。もちろん、commandキーワードは、関数が自分自身を呼び出すことを防ぐためにあります(無限再帰ループになります)。そしてもちろん、これらの定義を自分.bashrcまたは他のシェル初期化ファイルに入れる必要があります。
上記にはわずかな非効率性があります。いくつかのシェル(bashは1つ)で、あなたが言うなら
(cmd 1 ;  cmd 2 ; … ;  cmd n)
どこの外部、実行可能プログラム(すなわち、組み込みのないコマンド)で、シェルはただ待つために、転がっ余分なプロセスを維持し終了します。これは(おそらく)必要ではありません。長所と短所は議論の余地があります。少しのメモリとプロセススロットの使用を気にしない場合(およびを実行するときに必要なシェルプロセスがもう1つ表示される場合)、上記を実行して次のセクションにスキップします。余分なプロセスが存在しないシェルを使用している場合も同様です。しかし、余分なプロセスを避けたい場合、最初に試すことはcmdncmdnps
vim()  { ( ((SHLVL++)); exec vim  "$@");}
このexecコマンドは、余分なシェルプロセスが残るのを防ぐためのものです。
しかし、落とし穴があります。シェルの処理SHLVLはやや直感的です。シェルが起動すると、SHLVL設定されているかどうかを確認します。設定されていない場合(または数値以外に設定されている場合)、シェルはそれを1に設定します。設定されている場合(数値に)、シェルは1を追加します。
しかし、この論理により、あなたが言うならexec sh、あなたSHLVLは上がるべきです。しかし、実際のシェルレベルは増加していないため、これは望ましくありません。シェル
は、以下を実行するときに1を 引くことでこれを処理SHLVLしますexec。
$ echo "$SHLVL"
1
$ set | grep SHLVL
SHLVL=1
$ env | grep SHLVL
SHLVL=1
$ (env | grep SHLVL)
SHLVL=1
$ (env) | grep SHLVL
SHLVL=1
$ (exec env) | grep SHLVL
SHLVL=0
そう
vim()  { ( ((SHLVL++)); exec vim  "$@");}
ウォッシュです; SHLVL再び減少するためだけに増加します。vim関数の恩恵を受けずに、単に言うこともできます。
  注:
  StéphaneChazelas(彼はすべてを知っている)によると、一部のシェルは、サブシェル内にある場合、これを行わないほどスマートexecです。
これを修正するには、次のようにします
vim()  { ( ((SHLVL+=2)); exec vim  "$@");}
それから、シェルレベルとは独立してvimレベル
 をカウントしたいことがわかりました。まあ、まったく同じトリックが機能します(まあ、少し修正します):
vim() { ( ((SHLVL++, VILVL++)); export VILVL; exec vim "$@");}
(などのためにvi、viewなど)ザがexportあるため必要であるVILVLデフォルトで環境変数として定義されていません。ただし、関数の一部である必要はありません。あなたはexport VILVL(あなたの.bashrc)別個のコマンドとして言うことができます。また、前述のように、追加のシェルプロセスが問題にならない場合は、のcommand vim代わりに行うことができexec vim、そのままにしておくことができますSHLVL。
vim() { ( ((VILVL++)); command vim "$@");}
  個人設定:のような
  名前に変更VILVLすることができVIM_LEVELます。「VILVL」を見ると、目が痛い。彼らは、それが「ビニル」のスペルミスか、不正なローマ数字かどうかを見分けることができません。
サポートしていないシェルSHLVL(ダッシュなど)を使用している場合、シェルがスタートアップファイルを実装している限り、自分でシェルを実装できます。次のようなことをしてください
if [ "$SHELL_LEVEL" = "" ]
then
    SHELL_LEVEL=1
else
    SHELL_LEVEL=$(expr "$SHELL_LEVEL" + 1)
fi
export SHELL_LEVEL
あなたの.profileファイルまたは該当するファイル。(おそらく、名前を使用しないでSHLVLください。これをサポートするシェルを使用し始めると混乱が発生しますSHLVL。)
他の回答は、環境変数値をシェルプロンプトに埋め込む問題に対処しているので、それを繰り返すことはしません。特に、あなたはすでにそれを行う方法を知っていると言います。
               
              
$SHLVL変数は、あなたが探しているもの(いくつかのシェルによって維持されていますか)?