在 .bashrc 中使用导出

在 .bashrc 中使用导出

我注意到我的前面.bashrc有一些行,例如export

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

而其他人则不然,例如

HISTSIZE=100000

export我想知道,首先,这是否正确,其次,在 中使用的规则是什么.bashrc

答案1

您只需要export那些应该被您在 shell 中启动的其他程序“看到”的变量,而那些只在 shell 本身内部使用的变量不需要编辑export

手册页是这样说的:

提供的名称被标记为自动导出到随后执行的命令的环境。如果-f给出了该选项,则名称指的是函数。如果未给出名称,或者-p 提供了该选项,则会打印此 shell 中导出的所有名称的列表。该-n选项会导致从每个名称中删除导出属性。如果变量名后跟 =word,则变量的值设置为 word。 export 返回退出状态 0,除非遇到无效选项、其中一个名称不是有效的 shell 变量名称,或者-f提供的名称不是函数。

这可以通过以下方式证明:

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

所以回答你的问题:

这取决于变量将在哪里使用,是否必须导出它。

答案2

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

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

不要用于exportshell 变量。 Shell 变量是 shell 作为编程语言的一个特性。 Shell 变量仅在设置它们的 shell 内部使用;它们对于 shell 启动的程序没有任何意义。创建子 shell 时,shell 变量会被复制,就像 shell 状态的其余部分一样。以下是一些对流行 shell 有意义的 shell 变量示例:

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

除了 shell 使用的变量之外,大多数 shell 脚本也将变量用于其内部目的。

大多数环境变量(例如)对于整个会话都有意义,并且应该在或类似的文件PATH中设置。~/.profile仅对特定 shell 有意义的变量(例如PS1)应设置在特定于 shell 的文件中,例如~/.bashrc~/.zshrc。看是否有一个所有 shell 都能读取的“.bashrc”等效文件?

答案3

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

相关内容