Descubrir el shell predeterminado de un usuario dentro de un script de shell

10

Me preguntaba si hay una manera de averiguar el shell predeterminado del usuario actual dentro de un script de shell.

Caso de uso: estoy trabajando en un script que establece un alias para un comando y este alias se configura dentro de un script de shell.

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

Hay una lógica en el script donde intenta encontrar el shell predeterminado del usuario que ejecuta el script y agrega este alias en el archivo ~ / .bashrc o ~ / .zshrc respectivo

Pero a medida que agrego un shebang al frente del script y le pido explícitamente que use bash, las respuestas publicadas aquí siempre devuelven bash como se esperaba, aunque estoy ejecutando este script en un terminal ZSH.

¿Hay alguna manera de obtener el tipo de shell donde se ejecuta el script, independientemente del conjunto shebang?

Estoy buscando una solución que funcione tanto en Mac como en todos los bistros basados ​​en Linux.

Español89
fuente
@StephenRauch Debería haberlo mencionado antes, estoy buscando un método que funcione tanto en sistemas basados ​​en Mac como en Linux. / etc / passwd en Mac no contiene la información del usuario y solo se consulta en un modo de usuario único.
Spaniard89
¿Qué /etc/passwdtiene en OSX? Eché un vistazo rápido en línea y parece que el shell está allí, pero no el nombre de usuario. Sin embargo, la ID de usuario sigue ahí, ¿por qué no la usas?
terdon
Me pregunto si es posible tener una lista exhaustiva de proyectiles. ¿O todos los archivos de inicio de shell siempre se ajustan a. {Name_of_shell} rc?
jamesqf

Respuestas:

6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Ipor Sircer
fuente
Gracias funciona como un encanto! Esta es la única solución que probablemente funcione tanto para bistro basado en Mac como para Linux.
Spaniard89
1
Por cierto, edité el comando un poco para que sea independiente de todos los sistemas operativos, finger $USER | grep 'Shell:*' | cut -f3 -d ":"ya que las opciones grep -P no son compatibles con Mac.
Spaniard89
2
Tenga en cuenta que es fingerposible que no se instale en todas las máquinas. Es un paquete opcional en sistemas basados ​​en RedHat.
Stephen Harris
1
@ Kishorepandey: puede usar en getent|grep ^$USER:|cut -f: -f7lugar de dedo, si el dedo no se instaló de forma predeterminada.
Ipor Sircer
@Kishorepandey No hagas esto. Use la SHELLvariable de entorno si está presente. Mirar la base de datos del usuario le dará un resultado (el shell de inicio de sesión del usuario) pero podría no ser el resultado correcto (el shell interactivo favorito del usuario); depende de la configuración del usuario.
Gilles 'SO- deja de ser malvado'
19

La variable de entorno, SHELLsiempre se expande al shell de inicio de sesión predeterminado del usuario que invoca (obtiene el valor de /etc/passwd).

Para cualquier otro usuario, debe realizar un procesamiento con /etc/passwd, aquí hay un awkfragmento simple :

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

Reemplazar foobarcon el nombre de usuario real.

Si tiene ldap(o algo similar en su lugar), use getentpara obtener la base de datos en lugar de analizar directamente /etc/passwd:

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

o un enfoque más limpio, analicemos getent(gracias a @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
heemayl
fuente
3
getent passwd foobarpara evitar tener que coincidir con una línea en particular.
Kusalananda
Gracias por la respuesta. Debería haberlo mencionado antes, estoy buscando un método que funcione tanto en sistemas basados ​​en Mac como en Linux. / etc / passwd en Mac no contiene la información del usuario y solo se consulta en un modo de usuario único.
Spaniard89
4

Como getentno es un comando estándar en MacOS, es posible que desee utilizar una getpwuidllamada de nivel inferior que consultará los servicios de nombres para los que está configurada la máquina. Esto puede requerir llamar a perlo python, que son bastante comunes en la mayoría de las plataformas tipo Unix

por ejemplo, esto devolverá el shell para el usuario actual:

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

Puede obtener el shell predeterminado del usuario del entorno de esta manera:

echo $SHELL

Pero no así:

echo $0

Este último solo le dirá qué shell está usando actualmente su script. Entonces quieres la primera opción anterior.

Alxs
fuente
0

Corto e indoloro:

getent passwd <USER> | cut -d : -f 7
David Foerster
fuente
0

Tal vez esto:

   grep $USER </etc/passwd | cut -f 7 -d ":"
usuario226946
fuente
Esto no mejora en ninguna de las respuestas ya dadas.
Kusalananda
Esto no funcionará si hay varios usuarios con trabajos en común; por ejemplo, si USER=fredentonces esto va a coincidir fred, frederick, alfred, alfredo...
Stephen Harris