Sto cercando un modo semplice e affidabile per ottenere il nome della shell corrente dall'interno di uno script o di un file di origine ( non dalla riga di comando). Mi sarei aspettato di farlo, $(basename "$SHELL")
ma se la mia shell di accesso è zsh
e ho il seguente codice in some_script.sh
this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
e lo eseguo con bash some_script.sh
, elenca comunque zsh
anziché bash
anche se l'interprete utilizzato è /bin/bash
. Non sono sicuro del motivo per cui i progettisti di shell hanno scelto di mostrare la shell predefinita invece della shell corrente, ma sembra essere ciò con cui siamo bloccati.
Ci sono altre domande leggermente simili ( qui e qui ), ma le loro risposte sono insufficienti in molti modi.
- Spesso presumono che l'utente stia cercando di capire quale shell interattiva stanno usando, ma è pazzesco. So quello che sborsare Sono comandi digitando in - ho bisogno di codice che potrebbe essere eseguito ovunque per essere in grado di determinare quale shell si sta usando.
- Spesso danno diverse cose da provare - di nuovo come se fossi dalla riga di comando e possono solo giocherellare finché non impari a usare bash - ma ho bisogno di una sola cosa che sia affidabile in tutti i contesti.
- Spesso danno cose del tutto inutili dagli script, come
echo $0
. Ciò fallisce come mostrato nello script sopra. (Sì, funziona in una riga di comando della shell interattiva, ma perché non dovresti mai sapere quale shell stai usando?) - A volte danno comandi che (nei miei test limitati) includono le informazioni corrette, come
ps -p $$
, ma mancano di comandi sed / awk multipiattaforma, compatibili con shell diverse per reindirizzarli per ottenere solo il nome della shell e ignorare le altre informazioni che arrivano per il giro. - Includono cose che funzionano solo su un paio di conchiglie, come
$BASH_VERSION
e$ZSH_VERSION
. Voglio sostenere il maggior numero possibile di conchiglie, come ad esempiofish
,csh
,tcsh
.
Come posso rilevare in modo affidabile e preciso qualsiasi shell corrente ? Sto cercando qualcosa che funzioni su più piattaforme, negli script e per quante più shell possibili e ragionevoli 1 .
AGGIORNAMENTO : Quando ho pubblicato questa domanda, mi aspettavo che ci fosse una struttura integrata nelle shell per darci queste informazioni, il che sembra non essere il caso. Dato che ora sembra inevitabile fare affidamento su qualcosa al di fuori delle shell, dovrei rendere più esplicito il fatto che sto chiedendo unasoluzione multipiattaforma (che, sebbene implicita dalle mie obiezioni ad altre risposte sopra, potrebbe essere facile perdere se si leggere attentamente la domanda).
Aggiornamento 2 Se qualcuno crede ancora che questo sia un duplicato della sola domanda di Linux perché la risposta di Stéphane non è solo per Linux, ecco le differenze tra ciò che sto chiedendo e ciò che ha fornito. (Nota che ciò che ha scritto è geniale e non lo sto bussando, ma non risolve il mio problema.)
- Sto cercando qualcosa di semplice e affidabile , quello
- può essere aggiunto a qualsiasi definizione script o funzione (che sarebbe di provenienza da una
.zshrc
o.bash_profile
o altro) in ramo. - Non è possibile utilizzare il suo script come utility esterna che passa il nome dell'interprete allo script / alla funzione chiamante, poiché sarà sempre interpretato dall'interprete predefinito e lo restituirà. Ciò rende difficile o impossibile l'utilizzo per i miei scopi. Se è possibile, è ancora molto molto difficile e la soluzione per farlo funzionare non è data nella risposta. Pertanto non ha risposto alla mia domanda, quindi non è un duplicato.
Se si vuole vedere qualcosa che sarà lavorare, dare un'occhiata a ShellDetective su GitHub . Ciò potrebbe rendere più semplice vedere le differenze tra ciò che è già presente su SE e ciò che questa domanda sta cercando (ed è stata in effetti scritta per soddisfare le esigenze di questa domanda, che erano insoddisfatte in qualsiasi altro luogo).
(PS se non si può credere che ci sia un caso d'uso per questo, immaginate le funzioni che vengono di provenienza in .zshrc
, .bash_profile
o .profile
seconda di ciò che viene utilizzato server e ciò conchiglie che ha a disposizione. Sono di origine in modo da avere alcuna linea shebang. Essi sono molto utili se possono funzionare in qualsiasi shell, ma a volte devono sapere in quale shell si trovano per sapere come comportarsi.)
1 Non mi occupo di "conchiglie" che non sono conchiglie nel senso tradizionale della parola. Non mi preoccupo delle shell che un ragazzo ha scritto per se stesso. Mi occupo solo di vere shell che si verificano effettivamente in natura e che qualcuno potrebbe presumibilmente dover usare quando si accede a un server su cui non possono semplicemente installare le shell che desiderano.
sh -c "…"
, quindi esegui la maggior parte del lavoro nella sintassi della shell POSIX.
fish
e la utilizzo per eseguire il tuo script, vuoi fish
o csh
?