在.bashrc中使用导出


45

我注意到自己前面.bashrc有几行export,例如

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

而其他人则没有

HISTSIZE=100000

我想知道如果,第一,这是正确的,而第二个规则是什么,用export.bashrc

Answers:


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"。使用echoI可以回显它的值,因为echo是外壳的一部分。
  • 然后我创建echo.sh。那是一个基本执行相同操作的小脚本,它只是echo ${MYVAR},但不同之处在于它将在不同的进程中运行,因为它是一个单独的脚本。
  • 调用echo.sh它时不会输出任何内容,因为新进程不会继承${MYVAR}
  • 然后${MYVAR}使用export关键字导出到我的环境中
  • 现在echo.sh再次运行相同命令时,它会回显内容,${MYVAR}因为它是从环境中获取的

因此,回答您的问题:

它取决于要在何处使用变量,是否必须导出它。


17

使用export环境变量。环境变量是操作系统功能。环境变量是由子进程继承的:如果将它们设置在Shell中,则它们在此Shell启动的所有程序中都可用。许多应用程序或外壳程序以外的特定应用程序使用的变量是环境变量。以下是一些常见环境变量的示例:

  • HOME—表示用户的主目录,这是每个用户的配置文件所在的位置。由读取每个用户的配置文件的任何程序使用,否则需要了解用户主目录的位置。
  • PATH—指示在哪里找到可执行文件以启动其他程序。由需要启动另一个程序的每个程序使用。
  • LD_LIBRARY_PATH—指示在哪里可以找到动态库文件。由每个动态链接的可执行文件使用。
  • EDITORVISUAL—表示需要编辑器时要运行的程序。由需要启动文本编辑器的任何程序使用。
  • DISPLAYXAUTHORITY—表示如何连接到X11服务器。由X11客户端(即GUI程序)使用。
  • LESSless运行时自动打开选项。由使用less
  • http_proxy—表示要使用的Web代理。大多数网络浏览器使用。

不要export用于shell变量。Shell变量是Shell作为一种编程语言的功能。Shell变量仅在设置它们的Shell内部使用;它们对shell启动的程序没有意义。创建子外壳程序时,外壳程序变量会重复,就像其余的外壳程序状态一样。以下是一些shell变量示例,这些变量对流行的shell有意义:

  • PS1 —在每个命令之前显示的提示。
  • IFS —在未加引号的变量扩展和命令替换中分隔单词的字符。
  • HISTFILE — Shell将在其中写入命令历史记录的文件。

除了外壳程序使用的变量外,大多数外壳程序脚本还将变量用于内部目的。

大多数环境变量(例如PATH)对于整个会话来说都是有意义的,应在~/.profile或类似文件中设置。仅在特定于外壳程序(例如PS1)的变量才应在特定于外壳程序的文件(例如~/.bashrc或)中设置~/.zshrc。请参阅是否所有外壳程序都读取“ .bashrc”等效文件?


3

对于bash内部变量,您不需要export。从您的示例来看 HISTTIMEFORMAT,bash本身使用了它,不需要导出 MYSQL_HISTFILEmysql并且需要导出,否则mysql就看不到它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.