چطور و چرا شما از متغیر $ SHLVL استفاده می کنید

متغیر $ SHLVL به شما می گوید که تعداد پوسته های عمیق شما چیست. اگر از این بابت اشتباه گرفته باشید، ابتدا باید از آن شروع کنیم.

پوسته چیست؟

پوسته دستورات را می گیرد و آنها را به سیستم عامل پایه برای انجام می دهد. در اکثر سیستم های لینوکس برنامه پوسته BASH (The Bourne Again Shell) نامیده می شود، اما برخی دیگر از جمله C Shell (tcsh) و پوسته KORN (ksh) وجود دارد.

چگونه برای دسترسی به پوسته لینوکس

به طور کلی به عنوان یک کاربر شما با برنامه پوسته با استفاده از یک برنامه شبیه سازی ترمینال مانند XTerm، konsole یا gnome-terminal ارتباط برقرار می کنید.

اگر شما یک مدیر ویندوز مانند Openbox یا یک محیط دسکتاپ مانند GNOME یا KDE دارید، شبیه سازی ترمینال را از منو یا تیک پیدا خواهید کرد. در بسیاری از سیستم ها، CTRL ALT و T نیز یک پنجره ترمینال را باز می کنند.

در عوض شما می توانید به یکی دیگر از tty (teletypewriter) بروید که دسترسی مستقیم به پوسته خط فرمان را فراهم می کند. شما می توانید این کار را با فشار دادن CTRL ALT و F1 یا CTRL ALT و F2 و غیره انجام دهید.

سطح شل چیست؟

هنگامی که یک فرمان را در یک پوسته اجرا می کنید، آن را در چیزی به نام سطح پوسته اجرا می کند. در یک پوسته می توانید یک پوسته دیگر را باز کنید که پوسته ای را ایجاد می کند یا پوسته ای که آن را باز کرده است.

بنابراین پوسته والدین ممکن است پوسته سطح 1 را در نظر بگیرد و پوسته کودک پوسته سطح 2 باشد.

چگونه نمایش سطح شل

باید بر اساس عنوان مقاله تعجب نکنید که با استفاده از متغیر $ SHLVL می توانید بگویید که کدام سطح پوسته شما در حال اجرا است.

برای دیدن سطح پوسته ای که در حال حاضر در حال اجرا هستید، نوع زیر را وارد کنید:

echo $ SHLVL

جالب توجه است که اگر فرمان بالا را در یک پنجره ترمینال اجرا کنید، ممکن است شگفت زده شوید که نتیجه نتیجه 2 است.

اگر با این حال شما با استفاده از tty همان دستور را اجرا میکنید، نتیجه 1 است.

چرا این مورد شما ممکن است بپرسید؟ خوب محیط دسک تاپ شما در حال اجرا است در بالای یک پوسته اجرا می شود. این پوسته سطح 1 خواهد بود. هر پنجره ترمینال که از محیط دسکتاپ باز می شود، باید یک پوسته پوسته ای باشد که محیط دسکتاپ را باز کرده و بنابراین سطح پوسته را نمی توان در هر شماره دیگری از 2 شروع کرد.

tty محیط دسکتاپ را اجرا نمی کند و به همین علت به سادگی یک سطح 1 است.

چگونه برای ایجاد Subshells

ساده ترین راه برای تست مفهوم پوسته ها و پوسته ها به شرح زیر است. یک پنجره ترمینال را باز کنید و زیر را تایپ کنید:

echo $ SHLVL

همانطور که از پنجره ی ترمینال می دانیم حداقل سطح پوسته 2 است.

حالا در داخل پنجره ترمینال نوع زیر را وارد کنید:

ش

دستور sh بصورت جداگانه یک پوسته تعاملی را اجرا می کند که بدین معنی است که شما با استفاده از یک پوسته درون یک پوسته یا یک پوسته پوسته ای قرار می گیرید.

اگر دوباره این را تایپ کنید:

echo $ SHLVL

شما خواهید دید که سطح پوسته به 3 تنظیم شده است. اجرای دستور sh از داخل زیرشبکه یک زیرچشمه پوسته زیر را باز می کند و بنابراین سطح پوسته در سطح 4 خواهد بود.

چرا سطح شل مهم است؟

سطح پوسته مهم است هنگام فکر کردن در مورد دامنه متغیرها در اسکریپت های شما.

بیایید با چیزی ساده شروع کنیم:

dog = maisie
echo $ سگ

اگر دستور بالا را در پوسته اجرا کنید، کلمه maisie به پنجره ترمینال نمایش داده می شود.

یک پوسته جدید را با تایپ کردن موارد زیر باز کنید:

ش

اگر این دستور را اجرا کنید خواهید دید که هیچ چیزی در واقع بازگشتی نیست:

echo $ سگ

به این دلیل است که متغیر $ dog در سطح shell 2 در دسترس است. اگر خروجی را برای خروج از زیرشبکه تایپ کنید و echo $ s را اجرا کنید، کلمه maisie دوباره نمایش داده خواهد شد.

همچنین در مورد رفتار متغیرهای جهانی درون یک پوسته مهم است.

از یک پنجره ترمینال جدید شروع کنید و موارد زیر را تایپ کنید:

صادرات dog = maisie
echo $ سگ

همانطور که انتظار میرفت کلمه مسیتی نمایش داده می شود. حالا یک زیرچشمی باز کنید و echo $ s را تایپ کنید. این بار شما متوجه خواهید شد که کلمه maisie نمایش داده می شود حتی اگر شما در یک subshell هستید.

دلیل این امر این است که دستور export صادرات سگ را متغیر جهانی ساخته است. تغییر متغیر $ dog در زیر پوسته، حتی اگر از دستور export استفاده می کنید، هیچ تاثیری در پوسته های والدین خود نداشته باشد.

امیدوارم از این شما می توانید ببینید که دانستن سطح پوسته شما در حال کار در برخی از اهمیت در هنگام نوشتن اسکریپت.

نمونه هایی که من داده ام بسیار ساده است، اما برای یک اسکریپت پوسته، یک اسکریپت پوسته دیگری را فراخوانی می کند که به نوبه خود اسکریپت پوسته دیگری را که اکنون در سطوح مختلف اجرا می شود، اسکن می کند. دانستن سطح پوسته می تواند بسیار مهم باشد.