Welche bash-rc-Dateien werden auf nicht interaktiven / nicht-Login-Shells ausgeführt?

950
vol7ron

Mein Verständnis

  • Es werden keine RC-Dateien für nicht interaktive / nicht angemeldete Shells aufgerufen. zum Beispiel diejenigen, die von cron betrieben werden
    (ich weiß es nicht sicher und würde sich auf das Fachwissen der Community stützen)

  • Für nicht interaktive Shells muss die BASH_ENVUmgebungsvariable gesetzt werden, sodass sie auf eine bestimmte RC-Datei gesetzt werden kann (z. B. BASH_ENV=$HOME/.bash_profile).

Die Hoffnung

Ich bin mir nicht sicher, was für eine Fülle von RC-Dateien zur Verfügung steht, also bin ich neugierig, ob es solche gibt, die ich nicht kenne. Wir hoffen, eine RC-Datei zu finden, die die folgenden Bedingungen erfüllt:

  • unabhängig vom Interaktions- / Anmeldemodus aufgerufen, sodass globale Shell-Umgebungsvariablen an einer Stelle gesetzt werden können
  • verhält sich eher wie csh / tcsh
3
Einige Prozesse erstellen eine eigene Umgebung wie "cron" und "sudo". fd0 vor 7 Jahren 0
Ich weiß nicht, ob dies auf Ubuntu beschränkt ist, aber Ubuntu hat systemweite Einstellungen für Umgebungsvariablen: https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables, die "sudo" erwähnt. Ich würde zum Beispiel erwarten, dass "cron" $ $ USER bereits gesetzt hat, aber stattdessen "$ LOGNAME" gesetzt wird - ich denke (kann mich nicht genau erinnern) vol7ron vor 7 Jahren 0

1 Antwort auf die Frage

1
KCD

Die Antwort auf Ihre spezifische Frage lautet, dass oft nur /etc/bash.bashrc(oder /etc/bashrc) geladen wird.

Es scheint eine Reihe von Möglichkeiten zu geben, dieses Problem anzugehen, die meisten sind leider Problemumgehungen. In keiner bestimmten Reihenfolge:

Fake ein Login

Anmeldungen werden ausgeführt /etc/profileund oft können Sie Ihre benutzerdefinierten Skripts einfügen/etc/profile.d/*.sh

Wickeln Sie es in ein Bash-Login

Manchmal ist es am einfachsten, einen Login auszulösen, dh

echo "do whatever $PATH $BASH $PS1 $0" 

wird

bash -lc 'echo "do whatever $PATH $BASH $PS1 $0"' 

Laden Sie das Profil manuell

Tun Sie, was Anmeldungen tun, laden Sie das Profil manuell

source /etc/profile;echo "do whatever $PATH $BASH $PS1 $0" 

Bearbeiten Sie globale Umgebungsvariablen

Für einfache Variablen, die Sie hinzufügen können, /etc/environmentum Ubuntu System-wide_environment_variables anzuzeigen, ist die Variablenerweiterung nicht funktionsfähig

THING_HOME="/opt/thing" PATH="$PATH:/opt/thing" # this will NOT work 

Für PATH könnte man es zB hinzufügen sudo sed -i 's#PATH=\"[^\"]*#&:/opt/thing#' /etc/environment

Bearbeiten Sie alle Bash-Shells

Sie können zu /etc/bash.bashrc(oder /etc/bashrc) hinzufügen, dies wird jedoch normalerweise vorzeitig beendet, wenn Sie nicht interaktiv sind. Daher müssen Sie Ihre Ergänzungen vorher hacken:

# If not running interactively, don't do anything [ -z "$PS1" ] && return 

Mach nichts davon

  • Betrachten Sie Symlinks, wenn Sie versuchen, dem PATH etwas hinzuzufügen
  • Erwägen Sie, dass Ihre Programme / Skripts ihre eigene Umgebung ändern
  • Systemd hat EnvironmentFileund EnvironmentzBsystemctl edit --full cron.service

Ich bin daran interessiert zu hören, ob jemand andere bessere Problemumgehungen hat!