hi,
spiele gerade mit den ESC-Sequencen der Bash rum und da fällt mir auf, dass root ger nicht seine .bahrc ausgewertet wird. Ist das richtig??
Jens
On Thu, Jan 18, 2001 at 01:24:18PM +0100, Jens Puruckherr wrote:
hi,
spiele gerade mit den ESC-Sequencen der Bash rum und da fällt mir auf, dass root ger nicht seine .bahrc ausgewertet wird. Ist das richtig??
Wenn die Bash die Login-Shell ist (also die, die unmittelbar nach deinem Login gestartet wird), dann führt sie zumindest bei mir die Datei .profile im /root-Verzeichnis aus. Wenn Du dann als Root noch eine zweite Instanz der bash aufrufst, dann müsste diese auf die .bashrc zugreifen.
Da hab ich gleich auch noch eine Frage: warum ist die Datei für die Login-Shell eigentlich für root ".profile" und für normale user ".bash_profile" ? (Ich weiß nicht, ob das etwas zur Sache tut: ich habe hier Debian 2.2 laufen).
Matthias
Am Donnerstag, 18. Januar 2001 11:16, schrieb Matthias Petermann:
Wenn die Bash die Login-Shell ist (also die, die unmittelbar nach deinem Login gestartet wird), dann führt sie zumindest bei mir die Datei .profile im /root-Verzeichnis aus. Wenn Du dann als Root noch eine zweite Instanz der bash aufrufst, dann müsste diese auf die .bashrc zugreifen.
Heilige Verwirrung!
Danke.
Jens
On Thursday 18 January 2001 15:39, Jens Puruckherr wrote:
Am Donnerstag, 18. Januar 2001 11:16, schrieb Matthias Petermann:
Wenn die Bash die Login-Shell ist (also die, die unmittelbar nach deinem Login gestartet wird), dann führt sie zumindest bei mir die Datei .profile im /root-Verzeichnis aus. Wenn Du dann als Root noch eine zweite Instanz der bash aufrufst, dann müsste diese auf die .bashrc zugreifen.
Heilige Verwirrung!
Besser Du schreibst das in .bashrc: ------------- export BASHRC_RUN=1 -------------
und das in .profile: ------------- test -z "$BASHRC_RUN" && . ~/.bashrc -------------
das stellt sicher, dass .bashrc in allen interaktiven Bash's ausgeführt wird.
Weitere Details Mittwoch oder auf http://lugddlect.sourceforge.net
Konrad
On 18.01.01 Konrad Rosenbaum (konrad.rosenbaum@t-online.de) wrote:
Moin,
Besser Du schreibst das in .bashrc:
export BASHRC_RUN=1
und das in .profile:
test -z "$BASHRC_RUN" && . ~/.bashrc
Ich drösel das jetzt mal auf: Zuerst wird die profile gelesen. Dabei wird festgestellt, daß der String $BASHRC_RUN leer ist und also die ~/.bashrc ausgeführt, die dann den String $BASHRC_RUN auf ungleich 0 setzt und *exportiert*. Wenn ich im selben Terminal nochmal eine bash starte, übernimmt die den Wert von $BASHRC_RUN, der Test liefert einen Wert ungleich null und die ~/.bashrc wird *nicht* gelesen. Nun stehen da bei mir schöne Aliasersetzung, wie "alias rm='rm -i'" (autsch -- ja schon gut, nicht schlagen!), und die nur in der Shell gelten, in der sie aufgerufen wurden. Damit hast Du Dir IMHO in den Fuß geschossen. Warum testet man nicht einfach die Existenz der ~/.bashrc ab und läßt die grundsätzlich laufen? Bzw. die zweite Lösung wäre, die Varible nicht zu exportieren.
H.
Am Fre den 19 Jan 2001 um 03:19:30 +0100 schrieb Hilmar Preusse:
On 18.01.01 Konrad Rosenbaum (konrad.rosenbaum@t-online.de) wrote:
Besser Du schreibst das in .bashrc: export BASHRC_RUN=1
und das in .profile: test -z "$BASHRC_RUN" && . ~/.bashrc
Das ist ja schon deshalb sinnlos, weil die .profile beim login ausgefuehrt wird, also nur genau ein mal, wo soll da was gesetzt sein? Ausser login vererbt dir irgendwelche Schaetze ;-)
Ich drösel das jetzt mal auf: Zuerst wird die profile gelesen. Dabei wird festgestellt, daß der String $BASHRC_RUN leer ist und also die ~/.bashrc ausgeführt, die dann den String $BASHRC_RUN auf ungleich 0 setzt und *exportiert*. Wenn ich im selben Terminal nochmal eine bash starte, übernimmt die den Wert von $BASHRC_RUN, der Test liefert einen Wert ungleich null und die ~/.bashrc wird *nicht* gelesen.
Einen Punkt fuer Hilmar.
Damit hast Du Dir IMHO in den Fuß geschossen. Warum testet man nicht einfach die Existenz der ~/.bashrc ab und läßt die grundsätzlich laufen? Bzw. die zweite Lösung wäre, die Varible nicht zu
Du wirst staunen, genau das ist das default. --> man bash
<joeyh> netgod: er, are these 2.2.0 packages 2.0.0pre9 or do you have a direct line with the gods?
<netgod> joeyh: i have the direct line Dresdener LaTeX-Stammtisch: http://www.ifbus.de/~schubi/LatexDD.html http://rudi.urz.tu-dresden.de/~hille/
Und Hilmar schreibt sich in seine .bashrc: [ `cat .signature | wc -l` -gt 4 ] && echo "`whoami`'s .sig ist zu lang"
Ergo: Der Punkt muss Hilmar leider wieder entzogen werden, somit steht es wieder Unentschieden.
andre
On 19.01.01 Andre Schulze (as8@Rcs1.urz.tu-dresden.de) wrote:
Und Hilmar schreibt sich in seine .bashrc: [ `cat .signature | wc -l` -gt 4 ] && echo "`whoami`'s .sig ist zu lang"
Ergo: Der Punkt muss Hilmar leider wieder entzogen werden, somit steht es wieder Unentschieden.
Auweia, die Netzbullen!
drachi:[hille] >[ `cat .signature | wc -l -gt 4 ] \ && echo "`whoami's .sig ist zu lang" cat: .signature: No such file or directory
Ätsch!
drachi:[hille] >grep sig ~/.mutt/send-hooks send-hook ~l set signature="'fortune -s > /tmp/.sig-tmp; cat ~/.sig.app >> \ /tmp/.sig-tmp; cat /tmp/.sig-tmp; rm /tmp/.sig-tmp'|" # "for known maillists"
nicht meine Schuld.
H., heute mit extra kurzer Sig.
On 19.01.01 Andre Schulze (as8@Rcs1.urz.tu-dresden.de) wrote:
Am Fre den 19 Jan 2001 um 03:19:30 +0100 schrieb Hilmar Preusse:
On 18.01.01 Konrad Rosenbaum (konrad.rosenbaum@t-online.de) wrote:
Moin,
Besser Du schreibst das in .bashrc: export BASHRC_RUN=1
und das in .profile: test -z "$BASHRC_RUN" && . ~/.bashrc
Das ist ja schon deshalb sinnlos, weil die .profile beim login ausgefuehrt wird, also nur genau ein mal, wo soll da was gesetzt sein? Ausser login vererbt dir irgendwelche Schaetze ;-)
Nein, es wird nichts gesetzt. Durch die nicht gesetzte Variable wird eindeutig festgestellt, daß es sich um eine Login-Shell hendelt.
Damit hast Du Dir IMHO in den Fuß geschossen. Warum testet man nicht einfach die Existenz der ~/.bashrc ab und läßt die grundsätzlich laufen? Bzw. die zweite Lösung wäre, die Varible nicht zu
Du wirst staunen, genau das ist das default. --> man bash
Warum sagst Du daß nicht gleich? Dann wird die ~/.bashrc ja doch gelesen und Konrads Lösung funktioniert doch, wie man schon in 20010118143558.A12730@rncmm2.urz.tu-dresden.de bestaunen durfte.
Es steht also auch ohne Signature 0:0. <duck>
Hilmar
On Saturday 20 January 2001 09:17, Hilmar Preusse wrote:
On 19.01.01 Andre Schulze (as8@Rcs1.urz.tu-dresden.de) wrote: Das ist ja schon deshalb sinnlos, weil die .profile beim login ausgefuehrt wird, also nur genau ein mal, wo soll da was gesetzt sein? Ausser login vererbt dir irgendwelche Schaetze ;-)
Nein, es wird nichts gesetzt. Durch die nicht gesetzte Variable wird eindeutig festgestellt, daß es sich um eine Login-Shell hendelt.
...ich dachte bisher: durch das "-" vor Argument 0 wird das festgestellt... ;-)
Leute, es wird unübersichtlich!
Fassen wir mal zusammen (Ausnahmen von den Regeln siehe Mittwoch): Bash ist Login-Shell: es wird .profile ausgeführt (und nur das) Bash ist Interaktiv: es wird .bashrc ausgeführt (und nur das) Bash ist Batch-Interpreter: wenn die Variable $ENV existiert wird das darin gespeicherte Skript genommen
Woran erkennt eine Bash ihren Status? Interpreter: sie hat Argumente, die auf ein Skript verweisen Interaktiv: keine Argumente (ausser Schalter, wie --posix) Login: das ist komplizierter....
Die Unix-exec*-Calls bekommen 3 Parameter(listen): Den Dateinamen des Programms (char*), alle Argumente (char**) und alle Umgebungsvariablen (char**). In den Argumenten hat Argument 0 eine Sonderstellung: es spiegelt den Namen des Programmes wieder (normalerweise ohne Pfad, im Gegensatz zum 1. Parameter von exec, wo immer der Pfad drin sein muss (...Ausnahmen....)). Bei einer Login-Shell wird diesem Argument jedoch ein "-" vorangestellt.
Konrad
Am Sam den 20 Jan 2001 um 09:17:16 +0100 schrieb Hilmar Preusse:
Besser Du schreibst das in .bashrc: export BASHRC_RUN=1
und das in .profile: test -z "$BASHRC_RUN" && . ~/.bashrc
Das ist ja schon deshalb sinnlos, weil die .profile beim login ausgefuehrt wird, also nur genau ein mal, wo soll da was gesetzt sein? Ausser login vererbt dir irgendwelche Schaetze ;-)
Nein, es wird nichts gesetzt. Durch die nicht gesetzte Variable wird eindeutig festgestellt, daß es sich um eine Login-Shell hendelt.
Oh, oh, das braucht man doch nicht festzustellen, wenn man das a priori schon weis. Euer Sportauspuff in den Skripten macht nur das, was die shell auch so schon machen wuerde. Ich wiederhole: man bash (jetzt sofort!)
Damit hast Du Dir IMHO in den Fuß geschossen. Warum testet man nicht einfach die Existenz der ~/.bashrc ab und läßt die grundsätzlich laufen? Bzw. die zweite Lösung wäre, die Varible nicht zu
Du wirst staunen, genau das ist das default. --> man bash
Warum sagst Du daß nicht gleich? Dann wird die ~/.bashrc ja doch gelesen und Konrads Lösung funktioniert doch, wie man schon in 20010118143558.A12730@rncmm2.urz.tu-dresden.de bestaunen durfte.
INVOCATION A login shell is one whose first character of argument zero is a -, or one started with the --login option.
An interactive shell is one whose standard input and out put are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.
So weit alles klar.
The following paragraphs describe how bash executes its startup files. If any of the files exist but cannot be read, bash reports an error. Tildes are expanded in file names as described below under Tilde Expansion in the EXPANSION section.
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behav ior.
Keine Rede von einer .bashrc beim login (Aha?).
When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.
Ok, soviel zu einer reinen login shell.
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the
Deshalb ist die Variable BASHRC_RUN sinnlos.
--norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.
When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi but the value of the PATH variable is not used to search for the file name.
Hilmar wird sich gleich Montag frueh eine kuerzere Leine kaufen gehen. <duck>
andre
On Friday 19 January 2001 20:58, Andre Schulze wrote:
Am Fre den 19 Jan 2001 um 03:19:30 +0100 schrieb Hilmar Preusse: On 18.01.01 Konrad Rosenbaum (konrad.rosenbaum@t-online.de) wrote:
Besser Du schreibst das in .bashrc: export BASHRC_RUN=1
und das in .profile: test -z "$BASHRC_RUN" && . ~/.bashrc
Das ist ja schon deshalb sinnlos, weil die .profile beim login ausgefuehrt wird, also nur genau ein mal, wo soll da was gesetzt sein? Ausser login vererbt dir irgendwelche Schaetze ;-)
Zu meiner Verteidigung: die Idee mit der Variablen stammt von SuSE. Entweder für andere Bourne-Shell verwandte, die auch die Segnungen der SuSE-.bashrc geniesen sollten oder für eine kaputte Bash-Version von vor vielen Jahren...
Ok, man kann den ganzen Kram auf das verkürzen: . ~/.bashrc schaden sollte es jedenfalls nicht (es sei denn man setzt PATH in der .bashrc, dann wird es immer länger).
Konrad
Am Thu den 18 Jan 2001 um 01:24:18PM +0100 schrieb Jens Puruckherr:
hi,
spiele gerade mit den ESC-Sequencen der Bash rum und da fällt mir auf, dass root ger nicht seine .bahrc ausgewertet wird. Ist das richtig??
man bash:
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.
Wenn du dich also als root einloggst (interactive), so wie man es _nicht_ macht, dann wird sie nicht ausgefuehrt.
man su:
su is used to become another user during a login session. Invoked without a username, su defaults to becoming the super user. The optional argument - may be used to pro vide an environment similiar to what the user would expect had the user logged in directly.
Mit su - wird also ein login als root simuliert und dessen .bash_profile und .profile ausgefuehrt. Machst du noch eine shell als root auf (z.b. xterm & ), so ist das dann eine interaktive nicht-login-shell, ergo wird die .bashrc ausgefuehrt.
The current environment is passed to the new shell. The value of $PATH is reset to /bin:/usr/bin for normal users, or /sbin:/bin:/usr/sbin:/usr/bin for the super user. This may be changed with the ENV_PATH and ENV_SUPATH defini tions in /etc/login.defs. When using the -m or -p options, the users environment is not changed.
Der Pfad wird auch noch aufgeraeumt, der Rest aber beibehalten. Tschuess und viel Spass beim basteln,
andre
lug-dd@mailman.schlittermann.de