Scoprire la shell predefinita di un utente all'interno di uno script di shell


10

Mi chiedevo se c'è un modo per scoprire la shell predefinita dell'utente corrente all'interno di uno script di shell?

Caso d'uso: sto lavorando a uno script che imposta un alias per un comando e questo alias è impostato in uno script shell.

!# /bin/bash
alias = 'some command to set the alias'

C'è una logica nello script in cui tenta di trovare la shell predefinita dell'utente che esegue lo script e aggiunge questo alias nel rispettivo file ~ / .bashrc o ~ / .zshrc

Ma mentre sto aggiungendo uno shebang nella parte anteriore dello script e chiedendo esplicitamente di usare bash, le risposte pubblicate qui restituiscono sempre bash come previsto, anche se sto eseguendo questo script su un terminale ZSH.

C'è un modo per ottenere il tipo di shell in cui viene eseguito lo script indipendentemente dal set di shebang?

Sto cercando una soluzione che funzioni sia su Mac che su tutti i bistro basati su Linux.


@StephenRauch Avrei dovuto menzionarlo prima, sto cercando un metodo che funzioni sia su sistemi Mac che Linux. / etc / passwd su Mac non contiene le informazioni dell'utente e viene consultato solo in una modalità utente singolo.
Spagnolo,

Che cosa /etc/passwdha su OSX? Ho dato una rapida occhiata online e sembra che la shell sia lì, non solo il nome utente. L'ID utente è ancora lì, perché non lo usi?
terdon

Mi chiedo se è anche possibile avere un elenco esaustivo di conchiglie. O tutti i file di avvio della shell sono sempre conformi a. {Name_of_shell} rc?
jamesqf

Risposte:


6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

Grazie funziona come un fascino! Questa è l'unica soluzione che probabilmente funziona sia per i bistro basati su mac che su Linux.
Spagnolo89

1
A proposito, ho modificato un po 'il comando per renderlo agnostico a tutti i sistemi operativi finger $USER | grep 'Shell:*' | cut -f3 -d ":"poiché le opzioni grep -P non sono supportate su Mac.
Spagnolo89

2
Si noti che fingerpotrebbe non essere installato su tutte le macchine. È un pacchetto opzionale su sistemi basati su RedHat.
Stephen Harris,

1
@Kishorepandey: è possibile utilizzare al getent|grep ^$USER:|cut -f: -f7posto del dito, se il dito non è stato installato per impostazione predefinita.
Ipor Sircer,

@Kishorepandey Non farlo. Utilizzare la SHELLvariabile di ambiente, se presente. Guardare il database degli utenti ti darà un risultato (la shell di login dell'utente) ma potrebbe non essere il risultato giusto (la shell interattiva preferita dell'utente) - dipende dalla configurazione dell'utente.
Gilles 'SO- smetti di essere malvagio' il

19

La variabile d'ambiente, SHELLsi espande sempre nella shell di accesso predefinita dell'utente che invoca (ottiene il valore da /etc/passwd).

Per ogni altro utente, è necessario eseguire un po 'di elaborazione /etc/passwd, ecco un semplice awkframmento:

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

Sostituisci foobarcon il nome utente effettivo.

Se hai ldap(o qualcosa di simile sul posto), usa getentper ottenere il database invece di analizzare direttamente /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

o approccio più pulito, lascia getentfare l'analisi (grazie a @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'

3
getent passwd foobarper evitare di dover abbinare una linea particolare.
Kusalananda

Grazie per la risposta. Avrei dovuto menzionarlo prima, sto cercando un metodo che funzioni sia su sistemi Mac che Linux. / etc / passwd su Mac non contiene le informazioni dell'utente e viene consultato solo in una modalità utente singolo.
Spagnolo,

4

Poiché getentnon è un comando standard su MacOS, è possibile che si desideri utilizzare una getpwuidchiamata di livello inferiore che consulterà i servizi di denominazione per i quali è configurata la macchina. Questo può richiedere chiamando a perlo python, che sono abbastanza comuni nella maggior parte piattaforme Unix-like

ad es. questo restituirà la shell per l'utente corrente:

perl -e '@x=getpwuid($<); print $x[8]'

2

È possibile ottenere la shell predefinita dell'utente dall'ambiente in questo modo:

echo $SHELL

Ma non così:

echo $0

Quest'ultimo ti dirà quale shell sta attualmente usando il tuo script. Quindi vuoi la prima opzione sopra.



0

Forse questo:

   grep $USER </etc/passwd | cut -f 7 -d ":"

Ciò non migliora in nessuna delle risposte già fornite.
Kusalananda

Questo non funzionerà se ci sono più utenti con lavori in comune; ad esempio, se USER=fredallora questo corrisponderà fred, frederick, alfred, alfredo...
Stephen Harris
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.