Nel mio .profile
, utilizzo il seguente codice per assicurarmi che gli alias e le funzioni relativi a Bash siano forniti solo se la shell di accesso è effettivamente Bash :
# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
# source ~/.bashrc if it exists.
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Attualmente sto mettendo i file di configurazione della shell, gli script e le funzioni sotto controllo della versione. Di recente ho anche avviato il processo di rimozione di Bashismi casuali dagli script di shell che non beneficiano delle funzionalità specifiche di Bash, ad esempio la sostituzione function funcname()
con funcname()
.
Per il mio repository di file shell, ho configurato un hook pre-commit che esegue l' checkbashisms
utilità dal pacchetto devscripts di Debian su ciascun sh
file nel repository per garantire che non introduca inavvertitamente la sintassi specifica di Bash. Tuttavia, questo genera un errore per il mio .profile
:
possible bashism in .profile line 51 ($BASH_SOMETHING):
if [ "${BASH_VERSION:-}" ]; then
Mi chiedevo se c'era un modo per verificare quale shell fosse in esecuzione che non avrebbe attivato un avviso checkbashisms
.
Ho controllato l'elenco delle variabili relative alla shell elencate da POSIX nella speranza che una di esse potesse essere utilizzata per mostrare la shell corrente. Ho anche esaminato le variabili impostate in una shell Dash interattiva ma, ancora una volta, non sono riuscito a trovare un candidato adatto.
Al momento, ho escluso .profile
dall'elaborazione da parte di checkbashisms
; è un piccolo file, quindi non è difficile controllarlo manualmente. Tuttavia, dopo aver studiato il problema, mi piacerebbe comunque sapere se esiste un metodo conforme a POSIX per determinare quale shell è in esecuzione (o almeno un modo che non causa checkbashisms
errori).
Ulteriori background / chiarimenti
Uno dei motivi per cui sto mettendo i miei file di configurazione della shell sotto il controllo della versione è configurare il mio ambiente su tutti i sistemi a cui attualmente accedo regolarmente: Cygwin, Ubuntu e CentOS (sia 5 che 7, usando Active Directory per l'utente autenticazione). Accedo spesso tramite X ambienti Windows / desktop e SSH per host remoti. Tuttavia, mi piacerebbe che questo fosse a prova di futuro e che dipendesse il meno possibile dalle dipendenze del sistema e da altri strumenti.
Ho usato checkbashisms
come semplice e automatizzato controllo di integrità per la sintassi dei miei file relativi alla shell. Non è uno strumento perfetto, ad esempio, ho già applicato una patch in modo che non si lamenti dell'uso dei command -v
miei script. Durante la ricerca, ho appreso che lo scopo reale del programma è garantire la conformità con la politica Debian che, a quanto ho capito, si basa su POSIX 2004 anziché sul 2008 (o sulla sua revisione del 2013).
.bash_profile
fonte che sia .profile
e (condizionatamente) .bashrc
.