【发布时间】: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