Sto eseguendo una nuova installazione di Oneiric (ovvero non un aggiornamento) su due sistemi diversi e sto eseguendo lo stesso set di problemi apparentemente correlati.
Il più frustrante del gruppo è che, quando uso i file .profile e .bashrc che ho portato con me da Mac OS X, accedendo a X tramite LightDM mi disconnette immediatamente. Credo che ciò sia causato dal fatto che, quando esegue "/ bin / sh", si comporta come / bin / dash, ma ha ancora la variabile $ SHELL impostata su / bin / bash.
Estrapolazione
Ho un enorme .bashrc
. Puoi vederlo qui se vuoi, ma i suoi contenuti probabilmente non sono rilevanti, a parte il fatto che è pieno di bashismi e il fatto che funzioni senza errori all'interno di xterm o su una console virtuale.
Il mio .profile
assomiglia a questo (abbreviato):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Se provo ad accedere a X tramite LightDM, mi disconnetterà immediatamente. Ricevo errori nel .xsession-errors
mio .bashrc che sembrano così (abbreviati):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
Come ho detto, quando eseguo bash da una console virtuale, non ottengo questi errori. Inoltre, se rimuovo il mio .profile, posso accedere a X bene. (Posso anche accedere a una console virtuale e utilizzare startx
per avviare una sessione X che funziona, ma questa ovviamente non è una soluzione a lungo termine.)
Tuttavia, ho scoperto che se corro /bin/sh -l
, io non ricevo gli errori. Ecco una sessione di esempio (nota: il prompt di bash che ho semplificato bash>
e il prompt di sh è giusto $
):
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: Perché sta succedendo questo?
Capisco che / bin / sh ora punta a trattino piuttosto che bash , ma se questo è vero, allora perché sta $SHELL
ancora ritornando /bin/bash
?
Q2: cosa posso fare per aggirare il problema?
C'è un modo per aggirare questo? Voglio mantenere il mio profilo caricando .bashrc in modo da ottenere lo stesso ambiente su entrambe le shell di login e non login, ma ovviamente voglio solo caricarlo per bash stesso, non / bin / sh mascherato da bash.
Potresti aver notato la differenza nel contenuto delle variabili $ BASH_VERSION sopra. Ho provato a racchiudere il mio .profile in qualcosa del genere:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
Il -n
test dovrebbe restituire true solo se la lunghezza della stringa è diversa da zero, tuttavia, anche se nella sessione precedente, quando sono in esecuzione sotto di /bin/sh -l
essa restituisce una stringa vuota per $ BASH_VERSION, quando è inclusa nel mio .profile in questo modo , supera il test! Procede per procurarsi il mio .bashrc e darmi gli stessi errori di prima.
Ora sono davvero confuso.
$SHELL
è quello che dice l'ultimo campo in /etc/passwd
(o getent passwd
).
~/.profile
Bash, cose specifiche per Bash ~/.bashrc
e avere ~/.bash_profile
entrambi i sorgenti.
dash -l
mostra anche$SHELL
avere il valore/bin/bash
.