[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bash liest weder .profile noch .bash_profile ein



Andreas Pakulat <apaku@gmx.de> writes:

>On 30.Oct 2004 - 22:44:23, Helmut Waitzmann wrote:
>> Andreas Pakulat <apaku@gmx.de> writes:
>> 
>> >On 26.Oct 2004 - 02:06:34, Helmut Waitzmann wrote:
>> >> Andreas Pakulat <apaku@gmx.de> writes:

>> Die Auswahl "KDE" im Sessions-Menü des GDM, "/etc/gdm/Sessions/KDE",
>> macht es richtig:  Das shell script beginnt mit folgender Zeile:
>> 
>>    #!/bin/bash -login
>> 
>> Das ist ein (nicht-interaktives) Login-bash-Skript, das beim Start
>> zunächst /etc/profile und danach "$HOME/.bash_profile" oder
>> "$HOME/.profile" liest.

>
>Also /etc/kde3/kdm/Xsession sourced /etc/X11/Xsession und hat
>#! /bin/sh
>
>Also in unstables gdm gibts keine KDE Session und da die eine bash
>benutzt wuerde ich ja mal behaupten wollen, die hast du selbst
>geschrieben oder?

Bei mir war es in der Debian-Woody-Distribution so drin.  Ich habe daran
nichts verändert.

>> >Beim Login mittels eines Display-Managers haengt der X11-Server am
>> >Displaymanager:
>> >
>> >init
>> > ├─kdm─┬─XFree86
>> > │     └─kdm───x-session-manag─┬─gnome-settings-
>> > │                             ├─kwrapper
>> > │                             └─ssh-agent
>> >		    
>> >kdm, wiederum wird von init ausgefuehrt, als letztes der Init-Skripte
>> >und benutzt wiederum soweit ich das sehe eine nicht-interaktive
>> >nicht-login-shell.
>> 
>> Wenn da also kdm oder x-session-manag (ksmserver?) keine "$HOME/.profile"
>> entsprechende Konfigurationsmöglichkeit bietet, sieht es in der Tat nicht
>> gut aus.
>
>x-session-manager == /etc/alternatives/x-session-manager und das zeigt
>aufs startkde Skript. Wie gesagt ich kann solche Sachen die nur einmal
>ausgefuehrt werden sollen mit in meine $HOME/.xsession schreiben, die
>wird beim Start der Session ausgefuehrt und sonst nicht, aehnlich
>.profile bei normalen login-Shells. 

Das stimmt in diesem Fall natürlich.  Was die Sache ärgerlich macht, ist,
dass das z.B. für die Distribution "Fedora Core release 1" bereits nicht
mehr stimmt:  Dort finden sich in '/etc/X11/gdm/Sessions' die
Shellscripte 'GNOME' und 'KDE', die nichts tun, als ein

   exec /etc/X11/xdm/Xsession gnome

bzw.

   exec /etc/X11/xdm/Xsession kde

zu starten.  /etc/X11/xdm/Xsession aber ist ein bash-Shellscript, in dem
(je nachdem, was für ein Session man ausgewählt hat) zum Schluss eines
der folgenden Kommandos ausgeführt wird:

   exec -l $SHELL -c "$SSHAGENT /usr/share/apps/switchdesk/Xclients.$1";
   exec -l $SHELL -c "xterm -geometry 80x24-0-0"
   exec -l $SHELL -c "$SSHAGENT gnome-session"
   exec -l $SHELL -c "$SSHAGENT /usr/share/apps/switchdesk/Xclients.kde"
   exec -l $SHELL -c "$SSHAGENT /usr/share/apps/switchdesk/Xclients.twm"
   exec -l $SHELL -c "$SSHAGENT $1"
   exec -l $SHELL -c "$SSHAGENT $HOME/.xsession"
   exec -l $SHELL -c "$SSHAGENT $HOME/.Xclients"
   exec -l $SHELL -c "$SSHAGENT /etc/X11/xinit/Xclients"
   exec -l $SHELL -c "xsm"

Das wird jedesmal des Benutzers "$SHELL" als nicht-interaktives
login-shell gestartet (siehe Beschreibung des Parameters "-l" zum
Kommando "exec" des bash) und ihm ein Kommando übergeben, das dann
jeweils das gewünschte Session hochfährt.  Das halte ich für (beinahe)
vorbildlich:  Egal, welches shell sich der Benutzer als "$SHELL" (via
/etc/passwd o.ä.) auch ausgesucht und via "$HOME"/.bash_profile,
"$HOME"/.profile oder "$HOME"/.login konfiguriert hat:  Es wird als
nicht-interaktives login-shell gestartet.  Damit ist eine ordentliche
Konfiguration nach des Benutzers Wünschen sichergestellt.

Könnte so etwas Debian nicht auch hinbekommen?

"Beinahe vorbildlich" nenne ich es deshalb, weil beim Zusammensetzen der
Kommandozeile (der Parameter zum "$SHELL"-option '-c')
Variablen-Auswertungen ohne Quoting verwendet werden.  Soweit aber die
Variablen SSHAGENT, HOME und 1 für das betreffende "$SHELL"
unzerbrechliche Werte enthalten (was vermutlich der Fall sein dürfte),
ginge das nochmal gut.  Das prüft aber /etc/X11/Xsession zuvor nicht ab.

Allerdings ist shell-unabhängiges Quoting ziemlich schwierig.  Am ehesten
könnte ich mir da noch folgende Vorgehensweise vorstellen:

1. Schreibe ein "'" (ohne die Anführungszeichen) hin.

2. Nimm den Variablenwert, setze hinter jedes darin enthaltene Apostroph
die Zeichenfolge "\''" (ohne die Anführungszeichen).

3. Schreibe noch ein "'" (ohne die Anführungszeichen) hin.

So entsteht ein in Apostrophe eingeschlossener Text, dessen in ihm
enthaltene Apostrophe ordentlich verpackt sind.

Der Königsweg, statt beispielsweise

   exec -l $SHELL -c "$SSHAGENT $1"

lieber

   exec -l "$SHELL" -c '"$@"' -"`basename "$SHELL"`" "$SSHAGENT" "$1"

hinzuschreiben, scheitert daran, dass erstens der Ausdruck "$@" nicht in
allen shells für die positional parameters steht und zweitens manche --
aber nicht alle -- shells in diesem Fall als ersten Parameter nach der
Kommandozeile den Namen des shells selbst, mit einem Minuszeichen vorne
dran versehen, verlangen:  Das bash und das bourne shell verlangen es,
das csh und das tcsh verbieten es, das ksh verlangt oder verbietet es je
nach Fassung oder OS.  Es ist ein Graus.
-- 
Wenn Sie mir E-Mail schreiben, stellen |  When writing me e-mail, please
Sie bitte vor meine E-Mail-Adresse     |  precede my e-mail address with
meinen Vor- und Nachnamen, etwa so:    |  my full name, like
Helmut Waitzmann <xxx@example.net>, (Helmut Waitzmann) xxx@example.net



Reply to: