Verwenden Sie den Export in .bashrc

45

Mir ist in meinem aufgefallen, .bashrcdass einige Zeilen exportvor sich haben, wie z

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

während andere nicht, wie

HISTSIZE=100000

Ich frage mich, ob dies erstens richtig ist und zweitens, wie die Regel für die Verwendung exportin lautet .bashrc.

Martin Vegter
quelle

Antworten:

53

Sie benötigen nur exportVariablen, die von anderen Programmen "gesehen" werden sollen, die Sie in der Shell starten, während diejenigen, die nur in der Shell selbst verwendet werden, nicht bearbeitet werden müssen export.

Dies ist, was die Manpage sagt:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Dies kann mit folgendem demonstriert werden:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Erläuterung:

  • Ich habe zuerst festgelegt ${MYVAR}, dass eine Shell-Variable mit MYVAR="value". Mit echoI kann ich den Wert davon wiedergeben, da Echo Teil der Shell ist.
  • Dann erstelle ich echo.sh. Das ist ein kleines Skript, das im Grunde das Gleiche tut, es ist nur ein Echo ${MYVAR}, aber der Unterschied ist, dass es in einem anderen Prozess ausgeführt wird, weil es ein separates Skript ist.
  • Beim Aufruf echo.shgibt es nichts aus, da der neue Prozess nicht erbt${MYVAR}
  • Dann exportiere ${MYVAR}ich mit dem exportSchlüsselwort in meine Umgebung
  • Wenn ich jetzt dasselbe echo.sherneut ausführe , wird der Inhalt von wiedergegeben, ${MYVAR}weil er aus der Umgebung stammt

So beantworten Sie Ihre Frage:

Es hängt davon ab, wo eine Variable verwendet wird, ob Sie sie exportieren müssen oder nicht.

Wiederholung
quelle
17

Verwenden Sie exportfür Umgebungsvariablen . Umgebungsvariablen sind eine Betriebssystemfunktion. Umgebungsvariablen werden von untergeordneten Prozessen geerbt: Wenn Sie sie in einer Shell festlegen, sind sie in allen Programmen verfügbar, die von dieser Shell gestartet werden. Variablen, die von vielen Anwendungen oder von bestimmten anderen Anwendungen als Shells verwendet werden, sind Umgebungsvariablen. Hier einige Beispiele für häufig verwendete Umgebungsvariablen:

  • HOME- gibt das Ausgangsverzeichnis des Benutzers an, in dem sich die benutzerspezifischen Konfigurationsdateien befinden. Wird von jedem Programm verwendet, das Konfigurationsdateien pro Benutzer liest oder auf andere Weise den Speicherort des Basisverzeichnisses des Benutzers kennen muss.
  • PATH- gibt an, wo ausführbare Dateien zum Starten anderer Programme zu finden sind. Wird von jedem Programm verwendet, das ein anderes Programm starten muss.
  • LD_LIBRARY_PATH- gibt an, wo sich dynamische Bibliotheksdateien befinden. Wird von jeder dynamisch verknüpften ausführbaren Datei verwendet.
  • EDITOR, VISUAL- gibt an, welches Programm ausgeführt werden soll, wenn ein Editor benötigt wird. Wird von jedem Programm verwendet, das einen Texteditor starten muss.
  • DISPLAY, XAUTHORITY- zeigt an, wie eine Verbindung zum X11-Server hergestellt werden soll. Wird von X11-Clients (dh GUI-Programmen) verwendet.
  • LESS- Optionen werden beim lessAusführen automatisch aktiviert . Verwendet von less.
  • http_proxy- gibt den zu verwendenden Web-Proxy an. Wird von den meisten Webbrowsern verwendet.

Nicht exportfür Shellvariablen verwenden. Shell-Variablen sind ein Merkmal der Shell als Programmiersprache. Shell-Variablen werden nur in der Shell verwendet, in der sie festgelegt sind. Sie haben keine Bedeutung für Programme, die von der Shell gestartet werden. Shell-Variablen werden wie der Rest des Shell-Status beim Erstellen einer Subshell dupliziert. Hier sind einige Beispiele für Shell-Variablen, die für beliebte Shells eine Bedeutung haben:

  • PS1 - die Eingabeaufforderung, die vor jedem Befehl angezeigt wird.
  • IFS - die Zeichen, die Wörter in nicht zitierten Variablenerweiterungen und Befehlsersetzungen trennen.
  • HISTFILE - Eine Datei, in die die Shell den Befehlsverlauf schreibt.

Zusätzlich zu Variablen, die von der Shell verwendet werden, verwenden die meisten Shell-Skripte Variablen für ihre internen Zwecke.

Die meisten Umgebungsvariablen (zB PATH) sind für eine ganze Sitzung sinnvoll und sollten in ~/.profileoder in einer ähnlichen Datei gesetzt werden. Variablen, die nur für eine bestimmte Shell sinnvoll sind (zB PS1), sollten in einer Shell-spezifischen Datei wie ~/.bashrcoder gesetzt werden ~/.zshrc. Siehe Gibt es eine ".bashrc" -Äquivalentdatei, die von allen Shells gelesen wird?

Gilles 'SO - hör auf böse zu sein'
quelle
3

Für Bash-interne Variablen benötigen Sie nicht export. Von Ihrem Beispiel HISTTIMEFORMATwird durch bash selbst verwendet und muss nicht ein Export MYSQL_HISTFILEfür ist mysqlund dass der Bedarf sonst exportiert mysqles nicht sehen.

Zelda
quelle