
Estoy ejecutando una nueva instalación de Oneiric (es decir, no una actualización) en dos sistemas diferentes y me encuentro con el mismo conjunto de problemas aparentemente relacionados.
Lo más frustrante de todo es que, cuando uso .profile y .bashrc que llevé conmigo desde Mac OS X, iniciar sesión en X a través de LightDM me desconecta inmediatamente. Creo que esto se debe al hecho de que, cuando se ejecuta "/bin/sh", se comporta como /bin/dash, pero aún tiene la variable $SHELL configurada en /bin/bash.
Extrapolación
Tengo una enorme .bashrc
. Puedes verloaquísi quieres, pero su contenido probablemente no sea relevante, aparte del hecho de que está lleno de bashismos y del hecho de que funciona sin errores dentro de xterm o en una consola virtual.
Mi .profile
aspecto es este (abreviado):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Si intento iniciar sesión en X a través de LightDM, se me cerrará la sesión inmediatamente. Recibo errores .xsession-errors
relacionados con mi .bashrc que se ven así (abreviados):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
Como dije, cuando ejecuto bash desde una consola virtual, no obtengo estos errores. Además, si elimino mi .profile, puedo iniciar sesión en X sin problemas. (También puedo iniciar sesión en una consola virtual y utilizarla startx
para iniciar una sesión X que funcione, pero, por supuesto, esta no es una solución a largo plazo).
Sin embargo, descubrí que si corro /bin/sh -l
,hacerobtener los errores. Aquí hay una sesión de ejemplo (nota: el indicador bash lo he simplificado a bash>
, y el indicador sh es simplemente $
):
bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
$
P1: ¿Por qué sucede esto?
Entiendo que/bin/sh ahora apunta al guión en lugar de al bash, pero si eso es cierto, ¿por qué sigue $SHELL
regresando /bin/bash
?
P2: ¿Qué puedo hacer para solucionarlo?
¿Hay alguna manera de solucionar esto? Quiero mantener mi perfil cargando .bashrc para obtener el mismo entorno tanto en el shell de inicio de sesión como en el de no inicio de sesión, pero obviamente solo quiero que se cargue para bash, no para /bin/sh disfrazado de bash.
Es posible que hayas notado la diferencia en el contenido de las variables $BASH_VERSION anteriores. Intenté envolver mi .profile en algo como esto:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
La -n
prueba debería devolver verdadero solo si la longitud de la cadena es distinta de cero; sin embargo, aunque en la sesión anterior, cuando estoy ejecutando, /bin/sh -l
devuelve una cadena vacía para $BASH_VERSION, cuando se incluye en mi .profile de esta manera. ¡Pasa la prueba! Luego proceden a buscar mi .bashrc y me dan los mismos errores que antes.
Ahora soyen realidadconfundido.
Respuesta1
Puedes hacer que el hecho que $BASH_VERSION
está en blanco dash
funcione para ti:
if [ "$BASH_VERSION" = '' ]; then
echo "This is dash."
else
echo "This is bash."
fi
Respuesta2
Sólo tienes que usar comillas en la variable BASH_VERSION
a usar.-n
if [ -n "$BASH_VERSION" ];then
echo "this is bash";
else
echo "this is dash";
fi
Respuesta3
Úselo /proc/[PID]/cmdline
para ver con qué se está ejecutando el script y probar lo que contiene. La $$
variable nos dará el PID del shell en ejecución. Así podemos hacer un script como este,
#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
echo "This is bash"
else
echo "This is some other shell"
fi
Aquí hay una prueba del mismo script:
$> bash test_script.sh
This is bash
$> dash test_script.sh
This is some other shell