از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استفاده از فرمان Exec در اسکریپت های شل
سرفصلهای مطلب
این راهنما توضیح می دهد روی دستور exec و استفاده از آن در اسکریپت های پوسته.
پیش نیازها:
برای انجام مراحلی که در این راهنما نشان داده شده است، به اجزای زیر نیاز دارید:
- یک سیستم لینوکس کاربردی درباره راه اندازی یک VM اوبونتو با استفاده از VirtualBox بیشتر بیاموزید.
- دسترسی به یک کاربر غیر ریشه با امتیاز sudo.
- یک ویرایشگر متن مناسب مثلا: Vim/NeoVim، نانو، متن عالی، VSCodium، و غیره.
فرماندهی Exec
دستور exec به خودی خود یک ابزار جداگانه نیست:
بلکه یک فرمان داخلی پوسته Bash است:
به عنوان توصیف از مرد page پیشنهاد میکند، اگر فرمانی مشخص شده باشد، exec پوسته را با آن جایگزین کند، و هیچ اضافی ایجاد نمیکند process. تعداد انگشت شماری گزینه موجود است که رفتار دستور exec را تغییر می دهد.
استفاده پایه
به طور پیشفرض، هر زمان که دستوری را اجرا میکند، Bash یک پوسته فرعی ایجاد میکند و دستور را فورش میکند.
در اینجا، دستور echo PID پوسته فعلی را چاپ می کند. پوسته Bash (PID: 978) یک فرزند جدید ایجاد می کند process برای کار با دستور خواب (PID: 8369).
حالا اگر دستور خواب را با استفاده از exec اجرا کنیم چه می شود؟
پدر و مادر باش process با دستور خواب جایگزین می شود. پس از اجرای موفقیت آمیز، به پوسته باز نمی گردد. در عوض، جلسه خاتمه می یابد.
محیط تمیز
پیکربندی پیشفرض Bash با مجموعهای از ترفندها و متغیرهای محیطی همراه است. در سناریوی خاصی (به عنوان مثال، اشکال زدایی)، ممکن است بخواهید اسکریپت/برنامه خود را در یک محیط تمیز اجرا کنید. با کمک exec می توانیم یک نمونه پوسته تمیز را به جای نمونه فعلی راه اندازی کنیم.
ابتدا از دستور printenv برای فهرست کردن تمام متغیرهای محیطی که در حال حاضر پیکربندی شده اند استفاده کنید:
اکنون، از exec برای راه اندازی یک نمونه تمیز استفاده کنید:
$ printenv
راه اندازی یک پوسته متفاوت
علاوه بر Bash و “sh”، چندین برنامه پوسته دیگر نیز وجود دارد که هر کدام امتیازات منحصر به فرد خود را دارند. اگر یک برنامه/اسکریپت به پوسته خاصی نیاز دارد، می توانید از exec برای جایگزینی پوسته Bash فعلی با پوسته مورد نظر استفاده کنید.
در مثال زیر، Bash را با “sh” جایگزین می کنیم:
$ اجرایی ش
$ pstree -پ
استفاده از Exec در اسکریپت ها
با خارج شدن اصول اولیه، اکنون می توانیم از exec در اسکریپت های پوسته خود استفاده کنیم.
مثال 1: کار با پوسته های مختلف
اسکریپت زیر را بررسی کنید:
اکو $SHELL
اکو “echo zsh با موفقیت راه اندازی شد” > zsh.sh
اجرایی zsh zsh.sh
در اینجا، اولین دستور echo پوسته فعلی را چاپ می کند. به طور پیش فرض، باید Bash باشد. سپس، دستور exec “zsh” را برای اجرای اسکریپت “zsh.sh” راه اندازی می کند.
اسکریپت زیر را اجرا کنید:
مثال 2: نادیده گرفتن فرآیند موجود
هنگام فراخوانی یک دستور/برنامه، Bash یک دستور جدید ایجاد می کند process. در اکثر مواقع، این موضوع نگران کننده نیست. با این حال، هنگام کار با یک سیستم با منابع بسیار محدود (مثلاً سخت افزار تعبیه شده)، از exec برای نادیده گرفتن منابع موجود استفاده می شود. process در حافظه می تواند کمک کند.
اسکریپت زیر را بررسی کنید:
pstree -پ
اجرایی pstree -پ
اکو “سلام دنیا”
در اینجا، اولین دستور pstree طرح اصلی را نشان می دهد process درخت هنگامی که دستور exec اجرا شد، دومین فرمان pstree جایگزین پوسته در حال اجرا می شود. دستور echo روی خط آخر اجرا نشد
اسکریپت زیر را اجرا کنید:
از آنجایی که بخشی از فیلمنامه بود، پس از اجرای موفقیت آمیز به پوسته اصلی باز می گردیم.
از آنجایی که دستور exec پوسته والد را با یک دستور/برنامه متفاوت جایگزین میکند، هر کدی که بعد از آن وجود دارد نامعتبر میشود. هنگام استفاده از آنها در اسکریپت های خود مراقب باشید.
مثال 3: ورود به سیستم
پوسته Bash 3 توصیف کننده فایل منحصر به فرد را برای هر برنامه/اسکریپت در حال اجرا ارائه می دهد:
- STDOUT (1): خروجی استاندارد، خروجی معمولی را ذخیره می کند
- STDERR (2): خطای استاندارد، پیام های خطا را ذخیره می کند
- STDIN (0): ورودی استاندارد
با استفاده از exec، میتوانیم این توصیفگرهای فایل را به مکان دیگری هدایت کنیم، به عنوان مثال: فایلهای log. به طور کلی می تواند به اشکال زدایی و ورود به سیستم کمک کند.
به طور کلی، اگر می خواهید STDOUT و STDERR را به یک فایل log هدایت کنید، از عملگر تغییر مسیر استفاده می کنید:
میمون دلار 2>&1 | سه راهی test.log
این روش در هر نقطه ای که می خواهید وارد شوید نیاز به تغییر مسیر دارد. برای حل این مشکل، می توانیم از دستور exec برای ایجاد تغییر مسیر دائمی برای جلسه پوسته استفاده کنیم. مثال زیر را بررسی کنید:
> test.log
اجرایی 1>>test.log
اجرایی 2>&1
اکو “سلام دنیا”
دستور_ اشتباه
در اینجا، خط اول یک فایل لاگ خالی ایجاد می کند. اولین دستور exec یک تغییر مسیر دائمی STDOUT را به فایل log ایجاد می کند. دومین فرمان exec STDERR را به STDOUT هدایت می کند.
با این تنظیمات، تمام خروجی ها و پیام های خطا در فایل log ریخته می شوند:
$ گربه test.log
اگر اسکریپت ورودی های گزارش پیوسته ایجاد کند چه؟
> test.log
اجرایی 1>>test.log
اجرایی 2>&1
در حالی که درست است، واقعی
انجام دادن
اکو تصادفی $
خواب 5
انجام شده
در اینجا، در بخش اول، یک تغییر مسیر دائمی از STDOUT و STDERR به فایل لاگ خود ایجاد می کنیم. حلقه while بینهایت فرمان echo را اجرا میکند تا زمانی که با استفاده از Ctrl + C آن را به زور ببندیم. متغیر $RANDOM یک متغیر ویژه است که هر بار که به آن دسترسی پیدا می شود یک رشته تصادفی را برمی گرداند.
برای بررسی ورودی گزارش به روز رسانی، از دستور tail زیر استفاده کنید:
توجه داشته باشید که این تغییر مسیر فقط برای جلسه پوسته ادامه دارد.
مثال 4: ورودی از فایل
مشابه روش ایجاد تغییر مسیر STDOUT و STDERR دائمی، می توانیم برای STDIN نیز ایجاد کنیم. با این حال، از آنجایی که STDIN برای ورودی استفاده می شود، پیاده سازی کمی متفاوت است.
در اسکریپت زیر، STDIN را از یک فایل می گیریم:
اکو “پژواک”سلام دنیا“” > ورودی
اجرایی < ورودی
خواندن خط 1
ارزیابی $line_1
در اینجا، در خط اول، از echo برای تولید محتوای فایل input_string با استفاده از تغییر مسیر استفاده می کنیم. دستور exec محتوای input_string را به STDIN جلسه پوسته فعلی هدایت می کند. پس از خواندن رشته، از eval استفاده می کنیم تا محتوای $line_1 را به عنوان یک کد پوسته در نظر بگیریم.
اسکریپت زیر را اجرا کنید:
نتیجه
ما در مورد دستور exec در Bash بحث کردیم. ما همچنین روش های مختلف استفاده از آن را در اسکریپت ها به نمایش گذاشتیم. ما استفاده از exec را برای کار با چندین پوسته، ایجاد اسکریپتهای کارآمد حافظه و تغییر مسیر توصیفگرهای فایل نشان دادیم.
این تنها بخش کوچکی از آنچه می توان با استفاده از برنامه نویسی Bash به دست آورد است. در مورد برنامه نویسی Bash از زیر مجموعه برنامه نویسی Bash اطلاعات بیشتری کسب کنید.
محاسبات مبارک!
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1402-12-28 19:45:04