اگر این صفحه را در یک جستجو پیدا کردید، احتمالاً در حال تلاش برای حل مشکلی با اجرای bash هستید.
شاید محیط bash شما متغیر محیطی را تنظیم نکرده باشد و دلیل آن را متوجه نشده باشید. ممکن است چیزی را در فایلها یا پروفایلهای مختلف bash boot یا همه فایلها به صورت تصادفی گیر کرده باشید تا زمانی که کار کند.
در هر صورت، هدف این یادداشت این است که رویه شروع 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