Esecuzione di Bash in dettaglio

Se hai trovato questa pagina effettuando una ricerca, probabilmente stai cercando di risolvere qualche problema con l'esecuzione di bash.

Forse il tuo ambiente bash non sta impostando una variabile di ambiente e non capisci perché. Potresti aver bloccato qualcosa in vari file o profili di avvio di bash o in tutti i file in modo casuale finché non ha funzionato.

In ogni caso, lo scopo di questa nota è esporre la procedura per avviare bash nel modo più semplice possibile in modo da poter affrontare i problemi.

Диаграмма

Questo diagramma di flusso riassume tutti i processi durante l'esecuzione di bash.

Esecuzione di Bash in dettaglio

Ora diamo uno sguardo più da vicino a ciascuna parte.

Accedi alla Shell?

Per prima cosa devi scegliere se sei nella shell di login oppure no.

La shell di login è la prima shell che inserisci quando accedi per una sessione interattiva. La shell di accesso non richiede nome utente e password. Puoi forzare l'avvio della shell di login aggiungendo un flag --login quando chiamato bash, ad esempio:

bash --login

La shell di login configura l'ambiente di base al primo avvio della shell bash.

Interattivo?

Quindi determini se la shell è interattiva o meno.

Ciò può essere verificato dalla presenza della variabile PS1 (installa la funzione di input del comando):

se [ "${PS1-}" ]; then echo interattivo else echo non interattivo fi

Oppure controlla se l'opzione è impostata -i, utilizzando una variabile trattino speciale - in bash, ad esempio:

$eco$-

Se è presente un simbolo nell'output i, la shell è interattiva.

Nella shell di accesso?

Se ti trovi in ​​una shell di login, bash cerca il file /etc/profile e viene eseguito se esiste.

Quindi cerca uno qualsiasi di questi tre file nel seguente ordine:

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

Quando ne trova uno, lo avvia e salta gli altri.

In una shell interattiva?

Se ti trovi in ​​una shell non di login, si presuppone che tu sia già stato in una shell di login, l'ambiente è configurato e verrà ereditato.

In questo caso, i due file seguenti vengono eseguiti in ordine, se esistono:

/etc/bash.bashrc ~/.bashrc

Nessuna opzione?

Se non ti trovi né in una shell di login né in una shell interattiva, il tuo ambiente sarà effettivamente vuoto. Ciò causa molta confusione (vedi sotto sui lavori cron).

In questo caso bash guarda la variabile BASH_ENV il tuo ambiente e crea il file corrispondente specificato lì.

Difficoltà comuni e regole pratiche

lavori cron

Il 95% delle volte che eseguo il debug dell'avvio di bash è perché il processo cron non viene eseguito come previsto.

Questo dannato compito funziona bene quando lo eseguo dalla riga di comando, ma fallisce quando lo eseguo in crontab.

Qui due ragioni:

  • I lavori Cron non sono interattivi.
  • A differenza degli script da riga di comando, i lavori cron non ereditano l'ambiente shell.

In genere non noterai o non ti importerà che uno script di shell non è interattivo perché l'ambiente eredita dalla shell interattiva. Ciò significa che tutto PATH и alias configurato come ti aspetteresti.

Ecco perché spesso è necessario fissarne uno specifico PATH per un'attività cron come qui:

* * * * * PATH=${PATH}:/percorso/del/mio/programma/cartella mioprogramma

Script che si chiamano a vicenda

Un altro problema comune è quando gli script vengono erroneamente configurati per chiamarsi a vicenda. Per esempio, /etc/profile fa appello a ~/.bashrc.

Questo di solito accade quando qualcuno tenta di correggere qualche errore e tutto sembra funzionare. Sfortunatamente, quando è necessario separare questi diversi tipi di sessioni, sorgono nuovi problemi.

Immagine Docker in modalità sandbox

Per sperimentare l'esecuzione di una shell, ho creato un'immagine Docker che può essere utilizzata per eseguire il debug dell'esecuzione di una shell in un ambiente sicuro.

Lanciare:

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

Si trova il Dockerfile qui.

Per forzare l'accesso e simulare una shell di accesso:

$ bash --login

Per testare un insieme di variabili BASH_ENV:

$ env | grep BASH_ENV

Per il debug crontab ogni minuto verrà eseguito un semplice script (in /root/ascript):

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

Fonte: habr.com

Aggiungi un commento