Se truvate sta pagina in una ricerca, probabilmente pruvate à risolve qualchì prublema cù l'esecuzione di bash.
Forse u vostru ambiente bash ùn stabilisce micca una variabile d'ambiente è ùn capisce micca perchè. Puderete avè appiccicatu qualcosa in diversi schedarii o profili di bash boot o tutti i fugliali à l'aleatoriu finu à chì hà travagliatu.
In ogni casu, u puntu di sta nota hè di stabilisce a prucedura per inizià a bash u più simplice pussibule per pudè trattà i prublemi.
Diagramma
Stu diagramma di flussu riassume tutti i prucessi quandu esegue bash.
Avà fighjemu un ochju più vicinu à ogni parte.
Login Shell?
Prima vi tocca à sceglie s'è vo site in a cunchiglia di login o micca.
A cunchiglia di login hè a prima cunchiglia chì entra quandu accede à una sessione interattiva. A cunchiglia di login ùn hà micca bisognu di nome d'utilizatore è password. Pudete furzà a cunchiglia di login per inizià aghjunghjendu una bandiera --login
quandu chjamatu bash
, per esempiu:
bash --login
A cunchiglia di login stabilisce l'ambiente di basa quandu avete principiatu u bash shell.
Interattivu?
Allora determina se a cunchiglia hè interattiva o micca.
Questu pò esse verificatu da a presenza di a variabile PS1
(installa a funzione di input di cumandamentu):
if [ "${PS1-}" ]; poi ecu interattivu altru ecu non-interattivu fi
O vede se l'opzione hè stabilita -i
, utilizendu una variabile di trattino speciale -
in bash, per esempiu:
$echo$-
Se ci hè un simbulu in u output i
, allura a cunchiglia hè interattiva.
In a cunchiglia di login?
Sè site in una cunchiglia di login, allora bash cerca u schedariu /etc/profile
è corre s'ellu esiste.
Allora cerca per qualsiasi di sti trè schedari in l'ordine seguente:
~/.bash_profile ~/.bash_login ~/.profile
Quandu si trova unu, u principia è salta l'altri.
In una cunchiglia interattiva?
Sè vo site in una shell non-login, si assume chì avete digià statu in una shell di login, l'ambiente hè cunfiguratu è serà ereditatu.
In questu casu, i seguenti dui schedari sò eseguiti in ordine, se esistenu:
/etc/bash.bashrc ~/.bashrc
Nisuna opzione?
Se ùn site micca in una cunchiglia di login o in una cunchiglia interattiva, allora u vostru ambiente serà veramente viotu. Questu causa assai cunfusione (vede quì sottu nantu à i travaglii cron).
In questu casu, bash guarda a variabile BASH_ENV
u vostru ambiente è crea u schedariu currispundente specificatu quì.
Difficultà cumuni è regule di u pulgaru
cron jobs
U 95% di u tempu debug l'iniziu di bash hè perchè u travagliu cron ùn funziona micca cum'è previstu.
Stu dannatu compitu funziona bè quandu l'aghju eseguitu nantu à a linea di cummandu, ma falla quandu l'aghju eseguitu in crontab.
hè dui mutivi:
- I travaglii Cron ùn sò micca interattivi.
- A cuntrariu di i script di linea di cummanda, i travaglii di cron ùn eredite micca l'ambiente di shell.
Di genere, ùn avete micca avvistu o cura chì un script di shell ùn hè micca interattivu perchè l'ambiente eredita da a shell interattiva. Questu significa chì tuttu PATH
и alias
cunfiguratu cum'è tù avissi aspittatu.
Hè per quessa hè spessu necessariu di stabilisce un specificu PATH
per un compitu cron cum'è quì:
* * * * * PATH=${PATH}:/path/to/my/programme/cartulare myprogram
Scripts chì si chjamanu
Un altru prublema cumuni hè quandu i script sò cunfigurati per errore per chjamà l'altri. Per esempiu, /etc/profile
appellu à ~/.bashrc
.
Questu succede di solitu quandu qualchissia hà pruvatu à riparà qualchì errore è tuttu paria di travaglià. Sfurtunatamente, quandu avete bisognu di separà sti sfarenti tippi di sessioni, sorgenu novi prublemi.
L'immagine di Docker in sandbox
Per sperimentà cù l'esecuzione di una shell, aghju creatu una maghjina Docker chì pò esse usata per debug running a shell in un ambiente sicuru.
Lanciamentu:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile si trova
Per furzà u login è simulà una shell di login:
$ bash --login
Per pruvà un inseme di variàbili BASH_ENV
:
$ env | grep BASH_ENV
Per debugging crontab
un script simplice serà eseguitu ogni minutu (in /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Source: www.habr.com