あなたの質問を読んだとき、私の最初の考えはでした$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つ表示される場合)、上記を実行して次のセクションにスキップします。余分なプロセスが存在しないシェルを使用している場合も同様です。しかし、余分なプロセスを避けたい場合、最初に試すことはcmdn
cmdn
ps
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
変数は、あなたが探しているもの(いくつかのシェルによって維持されていますか)?