
Ich führe eine Neuinstallation von Oneiric (also kein Upgrade) auf zwei verschiedenen Systemen aus und stoße auf dieselben scheinbar zusammenhängenden Probleme.
Am frustrierendsten ist, dass ich mich sofort abmelde, wenn ich die .profile- und .bashrc-Dateien verwende, die ich von Mac OS X mitgenommen habe, und mich dann über LightDM bei X anmelde. Ich glaube, das liegt daran, dass sich „/bin/sh“ beim Ausführen wie /bin/dash verhält, die Variable $SHELL aber immer noch auf /bin/bash eingestellt ist.
Hochrechnung
Ich habe ein riesiges .bashrc
. Sie können es sehenHierwenn Sie möchten, aber sein Inhalt ist wahrscheinlich nicht relevant, abgesehen von der Tatsache, dass es voller Bashismen ist und der Tatsache, dass es innerhalb von xterm oder auf einer virtuellen Konsole fehlerfrei funktioniert.
Meine .profile
sieht so aus (abgekürzt):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Wenn ich versuche, mich über LightDM bei X anzumelden, werde ich sofort wieder abgemeldet. Ich erhalte Fehlermeldungen .xsession-errors
bezüglich meiner .bashrc, die wie folgt aussehen (abgekürzt):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
Wie gesagt, wenn ich Bash von einer virtuellen Konsole aus ausführe, treten diese Fehler nicht auf. Wenn ich außerdem mein .profile entferne, kann ich mich problemlos bei X anmelden. (Ich kann mich auch bei einer virtuellen Konsole anmelden und damit startx
eine funktionierende X-Sitzung starten, aber das ist natürlich keine langfristige Lösung.)
Ich habe jedoch festgestellt, dass /bin/sh -l
ich, wenn ich laufe,Tunerhalten Sie die Fehler. Hier ist eine Beispielsitzung (Hinweis: Die Bash-Eingabeaufforderung habe ich vereinfacht zu bash>
, und die Sh-Eingabeaufforderung ist nur $
):
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
$
F1: Warum passiert das?
ich verstehe das/bin/sh verweist jetzt auf dash statt auf bash, aber wenn das stimmt, warum kommt er dann $SHELL
immer noch zurück /bin/bash
?
F2: Was kann ich tun, um das Problem zu umgehen?
Gibt es eine Möglichkeit, dies zu umgehen? Ich möchte, dass mein Profil weiterhin .bashrc lädt, damit ich in Login- und Nicht-Login-Shells dieselbe Umgebung bekomme, aber natürlich möchte ich, dass es nur für Bash selbst geladen wird, nicht für /bin/sh, das als Bash getarnt ist.
Möglicherweise ist Ihnen der Unterschied im Inhalt der Variablen $BASH_VERSION oben aufgefallen. Ich habe versucht, meine .profile-Datei etwa so einzuschließen:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
Der -n
Test sollte nur dann „true“ zurückgeben, wenn die Länge der Zeichenfolge ungleich Null ist. Obwohl in der obigen Sitzung, wenn ich darunter laufe, /bin/sh -l
eine leere Zeichenfolge für $BASH_VERSION zurückgegeben wird, besteht er den Test, wenn er so in mein .profile aufgenommen wird! Er fährt dann mit der Quelle meiner .bashrc fort und gibt mir die gleichen Fehler wie zuvor.
Jetzt bin ichWirklichverwirrt.
Antwort1
Sie können das Leerzeichen $BASH_VERSION
in der Datei dash
für sich nutzen:
if [ "$BASH_VERSION" = '' ]; then
echo "This is dash."
else
echo "This is bash."
fi
Antwort2
Sie müssen nur Anführungszeichen auf die Variable setzen, BASH_VERSION
um sie zu verwenden-n
if [ -n "$BASH_VERSION" ];then
echo "this is bash";
else
echo "this is dash";
fi
Antwort3
Verwenden Sie /proc/[PID]/cmdline
diese Option, um zu sehen, womit das Skript ausgeführt wird, und um zu testen, was es enthält. Die $$
Variable gibt uns die PID der laufenden Shell. So können wir ein Skript wie dieses erstellen:
#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
echo "This is bash"
else
echo "This is some other shell"
fi
Hier ist ein Test desselben Skripts:
$> bash test_script.sh
This is bash
$> dash test_script.sh
This is some other shell