Extrapolación

Extrapolación

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 .profileaspecto 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-errorsrelacionados 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 startxpara 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 $SHELLregresando /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 -nprueba 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 -ldevuelve 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_VERSIONestá en blanco dashfuncione 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_VERSIONa usar.-n

if [ -n "$BASH_VERSION" ];then
 echo "this is bash"; 
else 
 echo "this is dash";
fi

Respuesta3

Úselo /proc/[PID]/cmdlinepara 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

información relacionada