Ha megtalálta ezt az oldalt a keresőben, valószínűleg valamilyen problémát próbál megoldani a bash indításával kapcsolatban.
Lehet, hogy a bash környezetében nem állítódik be a környezeti változó, és nem érti, miért. Lehet, hogy belepiszkált valamit a különböző bash indító fájlokba vagy a profilokba, vagy minden fájlba találomra, amíg nem működött.
Mindenesetre a bejegyzés célja, hogy a lehető legegyszerűbben ismertesse a bash indításának eljárását, hogy meg tudja oldani a problémákat.
Ábra
Ez az ábra összegzi az összes folyamatot a bash indításakor.

Most nézzük meg részletesebben mindegyik részt.
Bejelentkezési Shell?
Először ki kell választani, hogy bejelentkezési shell-ben van-e vagy sem.
A bejelentkezési shell az az első shell, amelybe belép, amikor interaktív munkamenetre lép. A bejelentkezési shell nem igényel felhasználónév és jelszó megadását. Kényszerítheti a bejelentkezési shell indítását a következő kapcsoló hozzáadásával: --login a meghíváskor: bash, például:
bash --login
A bejelentkezési shell beállítja az alap környezetet a bash shell első indítása során.
Interaktív?
Ezután meg kell határozni, hogy a shell interaktív-e vagy sem.
Ezt a következő változó létezésével ellenőrizheti: PS1 (ez beállítja a parancsbeviteli funkciót):
if [ "${PS1-}" ]; then
echo interaktív
else
echo nem interaktív
fi Vagy megnézni, hogy be van-e állítva a változó: -i, a kötőjel speciális változójával - a bash-ben, például:
$ echo $-
Ha a kimenetben szerepel a karakter i, akkor a shell interaktív.
A bejelentkezési shell-ben van?
Ha bejelentkezési shell-ben van, a bash keresi a fájlt /etc/profile és elindítja, ha létezik.
Ezután keresi az alábbi három fájl egyikét a következő sorrendben:
~/.bash_profile ~/.bash_login ~/.profile
Amikor talál egyet, megnyitja és a többit kihagyja.
Interaktív shell-ben?
Ha interaktív shell-ben van anélkül, hogy bejelentkezett volna (non-login shell), akkor feltételezhető, hogy már volt bejelentkezési shell-e, a környezet be van állítva és öröklődik.
Ebben az esetben az alábbi két fájlt futtatja sorrendben, ha léteznek:
/etc/bash.bashrc ~/.bashrc
Nincs egyik változat sem?
Ha sem bejelentkezési shell-ben, sem interaktív shell-ben nem tartózkodik, akkor a környezete valóban üres lesz. Ez nagy zűrzavart okozhat (lásd az alábbiakat a cron feladatokról).
Ebben az esetben a bash a környezeti változóra figyel: BASH_ENV és létrehozza a megadott fájlt.
Tipikus nehézségek és empirikus szabályok
Cron feladatok
A bash indítása esetén a problémáim 95%-a a cron feladatok nem várt működésével kapcsolatos.
Ez az átkos feladat normálisan működik, amikor a parancssorból indítom, de megbukik a crontab-ban való futtatáskor.
Itt két ok:
- A cron feladatok nem interaktívak.
- A parancssorbeli szkriptekkel ellentétben a cron feladatok nem öröklik a shell környezetet.
Általában nem veszed észre, és nem is törődsz azzal, hogy a shell szkript nem interaktív, mert a környezet az interaktív shell-től öröklődik. Ez azt jelenti, hogy minden PATH és alias úgy van beállítva, ahogy elvárnád.
Ezért gyakran meg kell határoznod egy konkrét PATH a cron feladathoz, mint itt:
* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogramSzkriptek, amelyek egymást hívják
Egy másik gyakori probléma, amikor a szkriptek véletlenül egymást hívják. Például, /etc/profile fordul ~/.bashrc.
Ez általában akkor történik, amikor valaki próbálta megoldani valamilyen hibát, és úgy tűnt, hogy minden működik. Sajnos, amikor ezeket a különböző típusú munkameneteket el kell különíteni, új problémák merülnek fel.
Docker kép homokozóban
A shell indításának kipróbálásához létrehoztam egy Docker képet, amely használható a shell indításának hibakeresésére biztonságos környezetben.
Indítás:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashA Dockerfile található .
Kényszerített bejelentkezés és belépő shell szimuláció:
$ bash --login A változók készletének ellenőrzéséhez BASH_ENV:
$ env | grep BASH_ENV A hibakereséshez crontab minden percben egy egyszerű szkript fog futni (a /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logForrás: habr.com
