Использование экспорта в .bashrc

45

Я заметил, .bashrcчто некоторые строки exportперед ними, такие как

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

в то время как другие не, такие как

HISTSIZE=100000

Мне интересно, если, во-первых, это правильно, а во-вторых, в чем заключается правило для использования exportв .bashrc.

Мартин Вегтер
источник

Ответы:

53

Вам нужны только exportпеременные, которые должны быть «видны» другими программами, которые вы запускаете в оболочке, в то время как те, которые используются только внутри самой оболочки, редактировать не нужно export.

Вот что говорит страница руководства:

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.

Это можно продемонстрировать с помощью следующего:

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

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

Объяснение:

  • Сначала я ${MYVAR}задаю переменную Shell с MYVAR="value". Используя echoя могу повторить значение этого, потому что эхо является частью оболочки.
  • Тогда я создаю echo.sh. Это небольшой скрипт, который в основном делает то же самое, он просто повторяет ${MYVAR}, но разница в том, что он будет выполняться в другом процессе, потому что это отдельный скрипт.
  • При вызове echo.shон ничего не выводит, потому что новый процесс не наследует${MYVAR}
  • Затем я экспортирую ${MYVAR}в свою среду с exportключевым словом
  • Когда я echo.shснова запускаю то же самое , он повторяет содержимое, ${MYVAR}потому что получает его из среды

Итак, чтобы ответить на ваш вопрос:

Это зависит от того, где будет использоваться переменная, нужно ли вам ее экспортировать или нет.

переигровка
источник
17

Используйте exportдля переменных среды . Переменные среды являются функцией операционной системы. Переменные среды наследуются дочерними процессами: если вы установите их в оболочке, они будут доступны во всех программах, запускаемых этой оболочкой. Переменные, используемые многими приложениями или конкретными приложениями, кроме оболочек, являются переменными среды. Вот несколько примеров общих переменных среды:

  • HOME- указывает домашний каталог пользователя, в котором находятся файлы конфигурации для каждого пользователя. Используется любой программой, которая читает файлы конфигурации для каждого пользователя или иным образом должна знать местоположение домашнего каталога пользователя.
  • PATH- указывает, где найти исполняемые файлы для запуска других программ. Используется каждой программой, которая должна запустить другую программу.
  • LD_LIBRARY_PATH- указывает, где найти файлы динамической библиотеки. Используется каждым динамически связанным исполняемым файлом.
  • EDITOR, VISUAL- указывает, какую программу запускать, когда нужен редактор. Используется любой программой, которая нуждается в запуске текстового редактора.
  • DISPLAY, XAUTHORITY- указывает, как подключиться к серверу X11. Используется клиентами X11 (т.е. программами с графическим интерфейсом).
  • LESS- параметры автоматически включаются при lessзапуске. Используется less.
  • http_proxy- указывает веб-прокси для использования. Используется большинством веб-браузеров.

Не используйте exportдля переменных оболочки. Переменные оболочки - это особенность оболочки как языка программирования. Переменные оболочки используются только внутри оболочки, где они установлены; они не имеют значения для программ, запускаемых оболочкой. Переменные оболочки дублируются при создании подоболочки, как и остальная часть состояния оболочки. Вот несколько примеров переменных оболочки, которые имеют значение для популярных оболочек:

  • PS1 - подсказка для отображения перед каждой командой.
  • IFS - символы, разделяющие слова в расширениях переменных без кавычек и подстановках команд.
  • HISTFILE - файл, в который оболочка запишет историю команд.

В дополнение к переменным, которые используются оболочкой, большинство сценариев оболочки используют переменные для своих внутренних целей.

Большинство переменных среды (например PATH) имеют смысл для всего сеанса и должны быть установлены в ~/.profileили подобном файле. Переменные, которые имеют смысл только для конкретной оболочки (например PS1), должны быть установлены в специфичном для оболочки файле, например, ~/.bashrcили ~/.zshrc. См. Есть ли ".bashrc" эквивалентный файл, прочитанный всеми оболочками?

Жиль "ТАК - перестань быть злым"
источник
3

Для bash внутренние переменные вам не нужны export. Из вашего примера HISTTIMEFORMATиспользуется сам bash и не нуждается в экспорте MYSQL_HISTFILEдля, mysqlкоторый нуждается в экспорте, иначе mysqlне увидит его.

Zelda
источник