Extrapolação

Extrapolação

Estou executando uma nova instalação do Oneiric (ou seja, não uma atualização) em dois sistemas diferentes e enfrentando o mesmo conjunto de problemas aparentemente relacionados.

O mais frustrante de todos é que, quando uso o .profile e o .bashrc que carreguei comigo no Mac OS X, fazer login no X via LightDM me desconecta imediatamente. Acredito que isso seja causado pelo fato de que, ao executar "/bin/sh", ele se comporta como /bin/dash, mas ainda tem a variável $SHELL definida como /bin/bash.

Extrapolação

Eu tenho um enorme .bashrc. Você pode ver issoaquise quiser, mas seu conteúdo provavelmente não é relevante, além do fato de estar cheio de bashismos e de funcionar sem erros dentro do xterm ou em um console virtual.

Minha .profileaparência é assim (abreviada):

case $SHELL in 
*bash*)
    if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
        . $HOME/.bashrc
    fi
    ;;
esac

Se eu tentar fazer login no X via LightDM, ele será desconectado imediatamente. Recebo erros .xsession-errorsrelacionados ao meu .bashrc parecidos com este (abreviado):

/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found

Como eu disse, quando executo o bash em um console virtual, não recebo esses erros. Além disso, se eu remover meu .profile, poderei fazer login no X sem problemas. (Também posso fazer login em um console virtual e usá-lo startxpara iniciar uma sessão X que funcione, mas é claro que essa não é uma solução de longo prazo.)

No entanto, descobri que se eu correr /bin/sh -l,fazerobter os erros. Aqui está um exemplo de sessão (nota: o prompt do bash simplifiquei para bash>e o prompt do sh é apenas $):

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

$

Q1: Por que isso está acontecendo?

Eu entendi aquilo/bin/sh agora aponta para dash em vez de bash, mas se isso for verdade, então por que $SHELLainda está retornando /bin/bash?

P2: O que posso fazer para contornar isso?

Existe uma maneira de contornar isso? Quero manter meu perfil carregando .bashrc para obter o mesmo ambiente em shells de login e sem login, mas obviamente quero que ele carregue apenas para o bash em si, e não para /bin/sh disfarçado de bash.

Você deve ter notado a diferença no conteúdo das variáveis ​​$BASH_VERSION acima. Eu tentei agrupar meu .profile em algo assim:

if [ -n $BASH_VERSION ]; then
    # the rest of my .profile as above
fi

O -nteste deve retornar verdadeiro apenas se o comprimento da string for diferente de zero, no entanto, mesmo na sessão acima, quando estou executando, /bin/sh -lele retorna uma string vazia para $BASH_VERSION, quando incluída no meu .profile assim , ele passa no teste! Eles prosseguem com a origem do meu .bashrc e me dão os mesmos erros de antes.

Agora eu sourealmenteconfuso.

Responder1

Você pode fazer com que o fato que $BASH_VERSIONestá em branco dashfuncione para você:

if [ "$BASH_VERSION" = '' ]; then
    echo "This is dash."
else
    echo "This is bash."
fi

Responder2

Você só precisa usar aspas na variável BASH_VERSIONpara usar-n

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

Responder3

Use /proc/[PID]/cmdlinepara ver com o que o script está sendo executado e testar o que ele contém. A $$variável nos dará o PID do shell em execução. Assim podemos fazer um script como este,

#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
    echo "This is bash"
else
    echo "This is some other shell"
fi

Aqui está um teste do mesmo script:

$> bash test_script.sh                                                                                                
This is bash
$> dash test_script.sh                                                                                                
This is some other shell

informação relacionada