Running Bash in dettagliu

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.

Running Bash in dettagliu

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.

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 ccà.

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

Add a comment