【问题标题】:Setting an environment variable before a command in bash在 bash 中的命令之前设置环境变量
【发布时间】:2015-12-24 23:14:00
【问题描述】:

我正在安装 MPC 库,我遇到了这个命令行(后来称为“初始命令”):

LD_LIBRARY_PATH=/usr/local/gnu/gmp-6.0.0/lib:/usr/local/gnu/mpfr-3.1.2/lib ../configure --prefix=/usr/local/gnu/mpc-1.0.3 --with-gmp=/usr/local/gnu/gmp-6.0.0 --with-mpfr=/usr/local/gnu/mpfr-3.1.2

LD_LIBRARY_PATH 的设置位置和配置命令的位置

../configure --prefix=/usr/local/gnu/mpc-1.0.3 --with-gmp=/usr/local/gnu/gmp-6.0.0 --with-mpfr=/usr/local/gnu/mpfr-3.1.2

之后执行。请注意,在第一行之后,还有另一行相同类型,另一个设置为LD_LIBRARY_PATH 和另一个命令。

据我了解,第一行相当于

export LD_LIBRARY_PATH=/usr/local/gnu/gmp-6.0.0/lib:/usr/local/gnu/mpfr-3.1.2/lib
../configure --prefix=/usr/local/gnu/mpc-1.0.3 --with-gmp=/usr/local/gnu/gmp-6.0.0 --with-mpfr=/usr/local/gnu/mpfr-3.1.2
unset LD_LIBRARY_PATH

我错了吗?如果是这样,如果我想将初始命令放在 .sh 文件中,我只需将其替换为前三行,对吗?如果没有,我该怎么做?

【问题讨论】:

  • 这并不是真正的等价,因为在命令执行后变量并没有取消设置,而是恢复到之前的值。试试看:a=hello; a=goodbye printenv a; echo "$a"。现在,在脚本中,对变量所做的修改不会被父 shell 看到,所以你并不真正关心 unset 部分(假设你的脚本只这样做,并且它被执行而不是来源)。
  • 哦,好的。所以,我可以这样做,而不是只做unset LD_LIBRARY_PATH,然后将LD_LIBRARY_PATH 设置为其以前的值,这是我在修改它之前会存储的值。有没有一种优雅的方式来做到这一点? “执行而不是采购”是什么意思? (我对与初始命令行严格等效的脚本非常感兴趣。)
  • 我不懂优雅。但是您可以做的是: 1. 不必费心设置回其原始值,因为您将运行一个脚本,正如我在之前的评论中所说,父 shell 看不到脚本中变量的修改。 2. 您确实为设置回其原始值而烦恼(为什么?):所以只需将其包装在子外壳中:使用括号:( export LD_LIBRARY_PATH=...; ./configure ...)。 3.否则保存变量的值并恢复它很棘手:你还必须保存它是否设置......
  • 为什么不简单地把“初始命令”放在脚本里?
  • 这是因为 shell 在运行命令之前会评估命令(从而扩展变量)。请改用foo=/usr/bin perl -le 'print $ENV{"foo"}'

标签: macos bash environment-variables sh


【解决方案1】:

你有点不对。导出使该设置可用于当前 shell 中的所有命令和子进程。在命令行上设置它只会在该命令的持续时间内设置它。

如果你正在编写一个shell脚本,设置变量并导出一次是很正常的,所以你不必在每一行都这样做。该值仅在 shell 脚本1 执行期间有效。它不会影响调用 shell 脚本的父进程,只会影响 shell 脚本中的命令。您无需在 shell 脚本末尾取消设置该值。

1 假设您没有使用.source 运行shell 脚本。

【讨论】:

  • 所以,想象一下我正在执行两个命令行:foo=/usr/bin cmd1 然后foo=/tmp/foo cmd2 其中foo 是一个已经有值的环境变量,比如说/usr/local/lib,在执行之前两个命令。在每个命令之后echoing foo 将打印/usr/local/lib。 (刚刚在终端中对其进行了测试。)现在,我如何在file.sh 文件中重现两个命令行(以及foo 的行为),我将按如下方式运行:./file.sh? (正如您可能猜到的那样,我不希望 sh 文件中执行的其他命令受到 foo 错误值的干扰 ...
  • 你可以在命令行上做的任何事情都可以放在脚本中,反之亦然。
  • @tripleee 我不确定,但如果是真的,命令行不能像在脚本中那样粘贴(foo=/usr/bin echo ${foo}...)。我知道这是可以做到的,但我现在不想求助于 perl(正如你在对我的问题的评论中所展示的那样),因为我对 *nix 词相当陌生——我想保持简单。
  • @user10000100_u:您可以在脚本中以与终端完全相同的方式执行此操作。两者完全没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多