اجرای Bash با جزئیات

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

شاید محیط bash شما متغیر محیطی را تنظیم نکرده باشد و دلیل آن را متوجه نشده باشید. ممکن است چیزی را در فایل‌ها یا پروفایل‌های مختلف bash boot یا همه فایل‌ها به صورت تصادفی گیر کرده باشید تا زمانی که کار کند.

در هر صورت، هدف این یادداشت این است که رویه شروع bash را به ساده ترین شکل ممکن تنظیم کنید تا بتوانید با مشکلات مقابله کنید.

نمودار

این فلوچارت تمام فرآیندها را هنگام اجرای bash خلاصه می کند.

اجرای Bash با جزئیات

حالا بیایید نگاه دقیق تری به هر قسمت بیندازیم.

ورود به سیستم شل؟

ابتدا باید انتخاب کنید که آیا در پوسته ورود هستید یا خیر.

پوسته ورود اولین پوسته ای است که هنگام ورود برای یک جلسه تعاملی وارد می شوید. پوسته ورود نیازی به نام کاربری و رمز عبور ندارد. شما می توانید پوسته ورود به سیستم را مجبور کنید با افزودن یک پرچم شروع به کار کند --login هنگام تماس bash، برای مثال:

bash -- ورود به سیستم

پوسته ورود به سیستم زمانی که برای اولین بار پوسته bash را راه اندازی می کنید، محیط پایه را تنظیم می کند.

در ارتباط بودن؟

سپس تعیین می کنید که پوسته تعاملی است یا خیر.

این را می توان با وجود متغیر بررسی کرد PS1 (عملکرد ورودی فرمان را نصب می کند):

اگر [ "${PS1-}" ]; سپس echo interactive other echo non-interactive fi

یا ببینید آیا گزینه تنظیم شده است -i، با استفاده از یک متغیر خط فاصله خاص - به عنوان مثال در bash:

$echo$-

اگر علامتی در خروجی وجود داشته باشد i، سپس پوسته تعاملی است.

در پوسته ورود؟

اگر در یک پوسته لاگین هستید، bash به دنبال فایل می‌گردد /etc/profile و در صورت وجود اجرا می شود.

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

~/.bash_profile ~/.bash_login ~/.profile

وقتی یکی را پیدا کرد، آن را شروع می کند و از بقیه می گذرد.

در یک پوسته تعاملی؟

اگر در یک پوسته غیر لاگین هستید، فرض بر این است که قبلاً در یک پوسته ورود بوده اید، محیط پیکربندی شده است و به ارث می رسد.

در این حالت دو فایل زیر در صورت وجود به ترتیب اجرا می شوند:

/etc/bash.bashrc ~/.bashrc

گزینه ای نیست؟

اگر در یک پوسته لاگین یا یک پوسته تعاملی نیستید، در واقع محیط شما خالی خواهد بود. این باعث سردرگمی زیادی می شود (در مورد مشاغل cron به زیر مراجعه کنید).

در این مورد bash به متغیر نگاه می کند BASH_ENV محیط شما و فایل مربوطه را که در آنجا مشخص شده است ایجاد می کند.

مشکلات رایج و قوانین سرانگشتی

مشاغل cron

95 درصد از مواردی که من راه اندازی bash را اشکال زدایی می کنم به این دلیل است که کار cron همانطور که انتظار می رود اجرا نمی شود.

این وظیفه لعنتی وقتی آن را در خط فرمان اجرا می کنم خوب کار می کند، اما وقتی آن را در crontab اجرا می کنم با شکست مواجه می شود.

اینجا دو دلیل:

  • مشاغل کرون تعاملی نیستند.
  • برخلاف اسکریپت های خط فرمان، cron job ها محیط پوسته را به ارث نمی برند.

معمولاً متوجه نمی‌شوید یا اهمیت نمی‌دهید که یک اسکریپت پوسته تعاملی نیست، زیرا محیط از پوسته تعاملی به ارث می‌رسد. این به این معنی است که همه چیز PATH и alias همانطور که انتظار دارید پیکربندی شده است.

به همین دلیل است که اغلب لازم است یک مشخصه تعیین کنید PATH برای یک کار cron مانند اینجا:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

اسکریپت هایی که یکدیگر را صدا می کنند

یکی دیگر از مشکلات رایج زمانی است که اسکریپت ها به اشتباه پیکربندی شده اند تا یکدیگر را فراخوانی کنند. مثلا، /etc/profile تجدید نظر می کند ~/.bashrc.

این معمولاً زمانی اتفاق می‌افتد که کسی سعی می‌کند برخی از خطاها را برطرف کند و به نظر می‌رسد همه چیز کار می‌کند. متأسفانه، زمانی که نیاز به جداسازی این نوع جلسات دارید، مشکلات جدیدی به وجود می آید.

تصویر داکر Sandboxed

برای آزمایش اجرای یک پوسته، من یک تصویر Docker ایجاد کردم که می‌توان از آن برای اشکال‌زدایی یک پوسته در یک محیط امن استفاده کرد.

راه اندازی:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerfile واقع شده است اینجا.

برای ورود اجباری و شبیه سازی پوسته ورود:

$ bash --login

برای آزمایش مجموعه ای از متغیرها BASH_ENV:

$ env | grep BASH_ENV

برای رفع اشکال crontab یک اسکریپت ساده هر دقیقه اجرا خواهد شد (در /root/ascript):

$ crontab -l
$ cat /var/log/script.log

منبع: www.habr.com

اضافه کردن نظر