Korzystanie z eksportu w .bashrc

45

Zauważyłem w sobie, .bashrcże niektóre linie mają exportprzed nimi, takie jak

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

podczas gdy inni nie, na przykład

HISTSIZE=100000

Zastanawiam się, czy po pierwsze jest to poprawne, a po drugie, jaka jest reguła używania exportw .bashrc.

Martin Vegter
źródło

Odpowiedzi:

53

Potrzebujesz tylko exportzmiennych, które powinny być „widoczne” przez inne programy, które uruchamiasz w powłoce, podczas gdy te, które są używane tylko w samej powłoce, nie muszą być exportedytowane.

Oto, co mówi strona podręcznika:

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.

Można to wykazać za pomocą:

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

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

Wyjaśnienie:

  • Najpierw ustawiłem ${MYVAR}zmienną Shell za pomocą MYVAR="value". Używając echomogę echo jego wartości, ponieważ echo jest częścią powłoki.
  • Potem tworzę echo.sh. To mały skrypt, który w zasadzie robi to samo, po prostu echo ${MYVAR}, ale różnica polega na tym, że będzie działał w innym procesie, ponieważ jest to osobny skrypt.
  • Podczas wywoływania echo.shnic nie wyświetla, ponieważ nowy proces nie dziedziczy${MYVAR}
  • Następnie eksportuję ${MYVAR}do mojego środowiska za pomocą exportsłowa kluczowego
  • Kiedy teraz uruchomię to samo echo.sh, wyświetla treść, ${MYVAR}ponieważ pobiera ją ze środowiska

Aby odpowiedzieć na twoje pytanie:

To zależy od tego, gdzie zmienna będzie używana, niezależnie od tego, czy musisz ją wyeksportować, czy nie.

powtórna rozgrywka
źródło
17

Użyj exportdla zmiennych środowiskowych . Zmienne środowiskowe są funkcją systemu operacyjnego. Zmienne środowiskowe są dziedziczone przez procesy potomne: jeśli ustawisz je w powłoce, będą one dostępne we wszystkich programach uruchomionych przez tę powłokę. Zmienne używane przez wiele aplikacji lub przez określone aplikacje inne niż powłoki są zmiennymi środowiskowymi. Oto kilka przykładów typowych zmiennych środowiskowych:

  • HOME- wskazuje katalog domowy użytkownika, w którym znajdują się pliki konfiguracyjne dla poszczególnych użytkowników. Używany przez dowolny program, który czyta pliki konfiguracyjne dla poszczególnych użytkowników lub w inny sposób musi znać lokalizację katalogu domowego użytkownika.
  • PATH- wskazuje, gdzie znaleźć pliki wykonywalne do uruchomienia innych programów. Używany przez każdy program, który musi uruchomić inny program.
  • LD_LIBRARY_PATH- wskazuje, gdzie znaleźć dynamiczne pliki bibliotek. Używany przez każdy dynamicznie połączony plik wykonywalny.
  • EDITOR, VISUAL- wskazuje, jaki program należy uruchomić, gdy potrzebny jest edytor. Używany przez dowolny program, który musi uruchomić edytor tekstu.
  • DISPLAY, XAUTHORITY- wskazuje, jak połączyć się z serwerem X11. Używany przez klientów X11 (tj. Programy GUI).
  • LESS- opcje są automatycznie włączane po lessuruchomieniu. Używany przez less.
  • http_proxy- wskazuje internetowy serwer proxy, którego należy użyć. Używany przez większość przeglądarek internetowych.

Nie używaj exportdo zmiennych powłoki. Zmienne powłoki są cechą powłoki jako języka programowania. Zmienne powłoki są używane tylko wewnątrz powłoki, w której są ustawione; nie mają znaczenia dla programów uruchamianych przez powłokę. Zmienne powłoki są duplikowane podczas tworzenia podpowłoki, podobnie jak reszta stanu powłoki. Oto kilka przykładów zmiennych powłoki, które mają znaczenie dla popularnych powłok:

  • PS1 - monit wyświetlany przed każdym poleceniem.
  • IFS - znaki oddzielające słowa w niecytowanych rozwinięciach zmiennych i podstawieniach poleceń.
  • HISTFILE - plik, w którym powłoka zapisze historię poleceń.

Oprócz zmiennych używanych przez powłokę większość skryptów powłoki używa zmiennych do swoich wewnętrznych celów.

Większość zmiennych środowiskowych (np. PATH) Ma sens dla całej sesji i powinna być ustawiona w ~/.profilepodobnym pliku. Zmienne, które mają sens tylko dla konkretnej powłoki (np. PS1), Powinny być ustawione w pliku specyficznym dla powłoki, takim jak ~/.bashrclub ~/.zshrc. Zobacz Czy istnieje plik równoważny „.bashrc” odczytywany przez wszystkie powłoki?

Gilles „SO- przestań być zły”
źródło
3

Do wewnętrznych zmiennych bash nie potrzebujesz export. Z Twojego przykład HISTTIMEFORMATjest używany przez samego bash i nie trzeba eksport MYSQL_HISTFILEjest mysqli że potrzeby eksportowania inaczej mysqlgo nie zobaczymy.

Zelda
źródło