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