Hochrechnung

Hochrechnung

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 .profilesieht 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-errorsbezü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 startxeine funktionierende X-Sitzung starten, aber das ist natürlich keine langfristige Lösung.)

Ich habe jedoch festgestellt, dass /bin/sh -lich, 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 $SHELLimmer 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 -nTest 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 -leine 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_VERSIONin der Datei dashfü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_VERSIONum sie zu verwenden-n

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

Antwort3

Verwenden Sie /proc/[PID]/cmdlinediese 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

verwandte Informationen