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.
fuente
/etc/passwd
tiene 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?Respuestas:
fuente
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
ya que las opciones grep -P no son compatibles con Mac.finger
posible que no se instale en todas las máquinas. Es un paquete opcional en sistemas basados en RedHat.getent|grep ^$USER:|cut -f: -f7
lugar de dedo, si el dedo no se instaló de forma predeterminada.SHELL
variable 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.La variable de entorno,
SHELL
siempre 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 unawk
fragmento simple :Reemplazar
foobar
con el nombre de usuario real.Si tiene
ldap
(o algo similar en su lugar), usegetent
para obtener la base de datos en lugar de analizar directamente/etc/passwd
:o un enfoque más limpio, analicemos
getent
(gracias a @Kusalananda):fuente
getent passwd foobar
para evitar tener que coincidir con una línea en particular.Como
getent
no es un comando estándar en MacOS, es posible que desee utilizar unagetpwuid
llamada de nivel inferior que consultará los servicios de nombres para los que está configurada la máquina. Esto puede requerir llamar aperl
opython
, que son bastante comunes en la mayoría de las plataformas tipo Unixpor ejemplo, esto devolverá el shell para el usuario actual:
fuente
Puede obtener el shell predeterminado del usuario del entorno de esta manera:
Pero no así:
Este último solo le dirá qué shell está usando actualmente su script. Entonces quieres la primera opción anterior.
fuente
Corto e indoloro:
fuente
Tal vez esto:
fuente
USER=fred
entonces esto va a coincidirfred
,frederick
,alfred
,alfredo
...