وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

استفاده از فرمان Exec در اسکریپت های شل

0 29
زمان لازم برای مطالعه: 4 دقیقه


این راهنما توضیح می دهد روی دستور exec و استفاده از آن در اسکریپت های پوسته.

پیش نیازها:

برای انجام مراحلی که در این راهنما نشان داده شده است، به اجزای زیر نیاز دارید:

  • یک سیستم لینوکس کاربردی درباره راه اندازی یک VM اوبونتو با استفاده از VirtualBox بیشتر بیاموزید.
  • دسترسی به یک کاربر غیر ریشه با امتیاز sudo.
  • یک ویرایشگر متن مناسب مثلا: Vim/NeoVim، نانو، متن عالی، VSCodium، و غیره.

فرماندهی Exec

دستور exec به خودی خود یک ابزار جداگانه نیست:

$ که اجرایی

استفاده از فرمان Exec در اسکریپت های شل

بلکه یک فرمان داخلی پوسته Bash است:

$ مرد اجرایی

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

به عنوان توصیف از مرد page پیشنهاد می‌کند، اگر فرمانی مشخص شده باشد، exec پوسته را با آن جایگزین کند، و هیچ اضافی ایجاد نمی‌کند process. تعداد انگشت شماری گزینه موجود است که رفتار دستور exec را تغییر می دهد.

استفاده پایه

به طور پیش‌فرض، هر زمان که دستوری را اجرا می‌کند، Bash یک پوسته فرعی ایجاد می‌کند و دستور را فورش می‌کند.

$ اکو $$ && خواب 999

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

$ pstree

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، دستور echo PID پوسته فعلی را چاپ می کند. پوسته Bash (PID: 978) یک فرزند جدید ایجاد می کند process برای کار با دستور خواب (PID: 8369).

حالا اگر دستور خواب را با استفاده از exec اجرا کنیم چه می شود؟

$ اکو $$ && اجرایی خواب 999

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

$ pstree -p

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

پدر و مادر باش process با دستور خواب جایگزین می شود. پس از اجرای موفقیت آمیز، به پوسته باز نمی گردد. در عوض، جلسه خاتمه می یابد.

محیط تمیز

پیکربندی پیش‌فرض Bash با مجموعه‌ای از ترفندها و متغیرهای محیطی همراه است. در سناریوی خاصی (به عنوان مثال، اشکال زدایی)، ممکن است بخواهید اسکریپت/برنامه خود را در یک محیط تمیز اجرا کنید. با کمک exec می توانیم یک نمونه پوسته تمیز را به جای نمونه فعلی راه اندازی کنیم.

ابتدا از دستور printenv برای فهرست کردن تمام متغیرهای محیطی که در حال حاضر پیکربندی شده اند استفاده کنید:

$ printenv

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

اکنون، از exec برای راه اندازی یک نمونه تمیز استفاده کنید:

$ اجرایی ضربه شدید

$ printenv

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

راه اندازی یک پوسته متفاوت

علاوه بر Bash و “sh”، چندین برنامه پوسته دیگر نیز وجود دارد که هر کدام امتیازات منحصر به فرد خود را دارند. اگر یک برنامه/اسکریپت به پوسته خاصی نیاز دارد، می توانید از exec برای جایگزینی پوسته Bash فعلی با پوسته مورد نظر استفاده کنید.

پیشنهاد می‌کنیم بخوانید:  Bash Nested For Loop

در مثال زیر، Bash را با “sh” جایگزین می کنیم:

$ pstree

$ اجرایی ش

$ pstree

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

استفاده از Exec در اسکریپت ها

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

مثال 1: کار با پوسته های مختلف

اسکریپت زیر را بررسی کنید:

#!/bin/bash

اکو $SHELL

اکو “echo zsh با موفقیت راه اندازی شد” > zsh.sh

اجرایی zsh zsh.sh

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، اولین دستور echo پوسته فعلی را چاپ می کند. به طور پیش فرض، باید Bash باشد. سپس، دستور exec “zsh” را برای اجرای اسکریپت “zsh.sh” راه اندازی می کند.

اسکریپت زیر را اجرا کنید:

$ ./test.sh

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

مثال 2: نادیده گرفتن فرآیند موجود

هنگام فراخوانی یک دستور/برنامه، Bash یک دستور جدید ایجاد می کند process. در اکثر مواقع، این موضوع نگران کننده نیست. با این حال، هنگام کار با یک سیستم با منابع بسیار محدود (مثلاً سخت افزار تعبیه شده)، از exec برای نادیده گرفتن منابع موجود استفاده می شود. process در حافظه می تواند کمک کند.

اسکریپت زیر را بررسی کنید:

#!/bin/bash

pstree

اجرایی pstree

اکو “سلام دنیا”

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، اولین دستور pstree طرح اصلی را نشان می دهد process درخت هنگامی که دستور exec اجرا شد، دومین فرمان pstree جایگزین پوسته در حال اجرا می شود. دستور echo روی خط آخر اجرا نشد

اسکریپت زیر را اجرا کنید:

$ ./test.sh

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

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

از آنجایی که دستور exec پوسته والد را با یک دستور/برنامه متفاوت جایگزین می‌کند، هر کدی که بعد از آن وجود دارد نامعتبر می‌شود. هنگام استفاده از آنها در اسکریپت های خود مراقب باشید.

مثال 3: ورود به سیستم

پوسته Bash 3 توصیف کننده فایل منحصر به فرد را برای هر برنامه/اسکریپت در حال اجرا ارائه می دهد:

  • STDOUT (1): خروجی استاندارد، خروجی معمولی را ذخیره می کند
  • STDERR (2): خطای استاندارد، پیام های خطا را ذخیره می کند
  • STDIN (0): ورودی استاندارد

با استفاده از exec، می‌توانیم این توصیفگرهای فایل را به مکان دیگری هدایت کنیم، به عنوان مثال: فایل‌های log. به طور کلی می تواند به اشکال زدایی و ورود به سیستم کمک کند.

به طور کلی، اگر می خواهید STDOUT و STDERR را به یک فایل log هدایت کنید، از عملگر تغییر مسیر استفاده می کنید:

$ اکو $$ | سه راهی test.log

میمون دلار 2>&1 | سه راهی test.log

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

این روش در هر نقطه ای که می خواهید وارد شوید نیاز به تغییر مسیر دارد. برای حل این مشکل، می توانیم از دستور exec برای ایجاد تغییر مسیر دائمی برای جلسه پوسته استفاده کنیم. مثال زیر را بررسی کنید:

#!/bin/bash

پیشنهاد می‌کنیم بخوانید:  روش نوشتن در یک فایل در Bash

> test.log

اجرایی 1>>test.log

اجرایی 2>&1

اکو “سلام دنیا”

دستور_ اشتباه

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، خط اول یک فایل لاگ خالی ایجاد می کند. اولین دستور exec یک تغییر مسیر دائمی STDOUT را به فایل log ایجاد می کند. دومین فرمان exec STDERR را به STDOUT هدایت می کند.

با این تنظیمات، تمام خروجی ها و پیام های خطا در فایل log ریخته می شوند:

دلار/test.sh

$ گربه test.log

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

اگر اسکریپت ورودی های گزارش پیوسته ایجاد کند چه؟

#!/bin/bash

> test.log

اجرایی 1>>test.log

اجرایی 2>&1

در حالی که درست است، واقعی

انجام دادن

اکو تصادفی $

خواب 5

انجام شده

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، در بخش اول، یک تغییر مسیر دائمی از STDOUT و STDERR به فایل لاگ خود ایجاد می کنیم. حلقه while بی‌نهایت فرمان echo را اجرا می‌کند تا زمانی که با استفاده از Ctrl + C آن را به زور ببندیم. متغیر $RANDOM یک متغیر ویژه است که هر بار که به آن دسترسی پیدا می شود یک رشته تصادفی را برمی گرداند.

برای بررسی ورودی گزارش به روز رسانی، از دستور tail زیر استفاده کنید:

$ دم test.log

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

توجه داشته باشید که این تغییر مسیر فقط برای جلسه پوسته ادامه دارد.

مثال 4: ورودی از فایل

مشابه روش ایجاد تغییر مسیر STDOUT و STDERR دائمی، می توانیم برای STDIN نیز ایجاد کنیم. با این حال، از آنجایی که STDIN برای ورودی استفاده می شود، پیاده سازی کمی متفاوت است.

در اسکریپت زیر، STDIN را از یک فایل می گیریم:

#!/bin/bash

اکو “پژواک”سلام دنیا“” > ورودی

اجرایی < ورودی

خواندن خط 1

ارزیابی $line_1

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

در اینجا، در خط اول، از echo برای تولید محتوای فایل input_string با استفاده از تغییر مسیر استفاده می کنیم. دستور exec محتوای input_string را به STDIN جلسه پوسته فعلی هدایت می کند. پس از خواندن رشته، از eval استفاده می کنیم تا محتوای $line_1 را به عنوان یک کد پوسته در نظر بگیریم.

اسکریپت زیر را اجرا کنید:

$ ./test.sh

استفاده از فرمان Exec در اسکریپت های شلاستفاده از فرمان Exec در اسکریپت های شل

نتیجه

ما در مورد دستور exec در Bash بحث کردیم. ما همچنین روش های مختلف استفاده از آن را در اسکریپت ها به نمایش گذاشتیم. ما استفاده از exec را برای کار با چندین پوسته، ایجاد اسکریپت‌های کارآمد حافظه و تغییر مسیر توصیف‌گرهای فایل نشان دادیم.

این تنها بخش کوچکی از آنچه می توان با استفاده از برنامه نویسی Bash به دست آورد است. در مورد برنامه نویسی Bash از زیر مجموعه برنامه نویسی Bash اطلاعات بیشتری کسب کنید.

محاسبات مبارک!

برای نگارش بخشهایی از این متن ممکن است از ترجمه ماشینی یا هوش مصنوعی GPT استفاده شده باشد
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم

زمان انتشار: 1402-12-28 19:45:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید