$ SHLVL変数は、深いシェルの数を知らせるために使用されます。あなたがこれに戸惑う場合は、最初から始める価値があります。
シェルとは何ですか?
シェルはコマンドを受け取り、それを基になるオペレーティングシステムに渡して実行します。ほとんどのLinuxシステムでは、シェルプログラムはBASH(The Bourne Again Shell)と呼ばれますが、Cシェル(tcsh)やKORNシェル(ksh)などの他のものもあります。
Linuxシェルにアクセスする方法
一般的に、ユーザーとしては、XTerm、konsole、gnome-terminalなどの端末エミュレーションプログラムを使用してシェルプログラムとやりとりします。
OpenboxやGNOMEやKDEなどのデスクトップ環境のようなウィンドウマネージャを実行している場合は、メニューまたはダッシュから端末エミュレータを見つけることができます。多くのシステムでは、CTRL ALTとTショートカットはターミナルウィンドウも開きます。
または、コマンドラインシェルに直接アクセスできる別のTTY(テレタイプライタ)に切り替えることもできます。これを行うには、CTRL ALTとF1またはCTRL ALTとF2などを押します。
シェルレベルとは何ですか?
シェルでコマンドを実行すると、シェルレベルで実行されます。シェル内で別のシェルを開くと、それをサブシェルまたはシェルを開いたシェルにすることができます。
したがって、親シェルはおそらくレベル1シェルとみなされ、子シェルはレベル2シェルになります。
シェルレベルを表示する方法
記事のタイトルに基づいて、どのシェルレベルを実行しているかを知る方法は、$ SHLVL変数を使用することです。
現在実行しているシェルレベルを確認するには、次のように入力します。
エコー$ SHLVL
むしろ興味深いことに、上記のコマンドを端末ウィンドウ内で実行すると、返される結果が2であることに驚くかもしれません。
しかし、ttyを使用して同じコマンドを実行すると、結果は1になります。
これはなぜあなたが求めるかもしれない場合ですか?まあ、実行しているデスクトップ環境はシェルの上で実行されています。そのシェルはレベル1になります。そのデスクトップ環境内で開くすべての端末ウィンドウは、デスクトップ環境を開いたシェルの子でなければならず、したがって、シェルレベルは2以外の任意の数で開始できません。
ttyはデスクトップ環境を実行していないため、単にレベル1のシェルです。
サブシェルを作成する方法
シェルとサブシェルの概念をテストする最も簡単な方法は次のとおりです。ターミナルウィンドウを開き、次のように入力します。
エコー$ SHLVL
端末ウィンドウからわかるように、シェルレベルの最小値は2です。
ターミナルウィンドウ内で次のように入力します。
sh
shコマンド自体は、シェルまたはサブシェル内のシェルを使用していることを意味する対話シェルを実行します。
これをもう一度入力すると:
エコー$ SHLVL
シェルレベルが3に設定されていることがわかります。サブシェル内からshコマンドを実行すると、サブシェルのサブシェルが開き、シェルレベルはレベル4になります。
シェルレベルが重要な理由
シェルレベルは、スクリプト内の変数の範囲について考えるときに重要です。
単純なものから始めましょう:
犬=メイシーエコー$ドッグ シェルで上記のコマンドを実行すると、maisieという単語がターミナルウィンドウに表示されます。 次のように入力して新しいシェルを開きます。 sh このコマンドを実行すると、実際に何も返されないことがわかります: エコー$ドッグ これは、$ dog変数がシェルレベル2でのみ使用可能であるためです。exitを入力してサブシェルを終了し、echo $ dogを再度実行すると、maisieという単語が再び表示されます。 また、シェル内のグローバル変数の動作について考える価値があります。 新しいターミナルウィンドウで始め、次のように入力します。 輸出犬= maisieエコー$ドッグ あなたが期待する通り、maisieという単語が表示されます。次に、サブシェルを開き、もう一度echo $ dogと入力します。今回は、あなたがサブシェルにいてもmaisieという言葉が表示されていることがわかります。 これは、エクスポートコマンドが$ dog変数をグローバルにしたためです。 exportコマンドを使用しても、サブシェル内の$ dog変数を変更しても、その親シェルには何の影響もありません。 うまくいけば、あなたが作業しているシェルレベルを知っていることは、スクリプトを書くときにいくつかの意味があることがわかります。 私が与えた例は非常に単純ですが、あるシェルスクリプトが別のシェルスクリプトを呼び出すのはよくあることです。別のシェルスクリプトは現在、別のシェルスクリプトを呼び出しています。シェルレベルを知ることは非常に重要です。