【问题标题】:environmental variable not available for next command in shell script [duplicate]环境变量不适用于 shell 脚本中的下一个命令 [重复]
【发布时间】:2017-04-21 09:17:24
【问题描述】:

我们有一个名为 source.sh 的 shell 脚本,它导出构建所需的许多 ENV 变量。

我试图通过在我的脚本中运行 source.sh 来访问这些 ENV 变量,但即使在运行之后我也无法访问后续命令的 ENV 变量。

我的脚本看起来很像:

#!/bin/bash

sh source.sh
cd $ROOT_VOS
make

但是这里 cd $ROOT_VOS 没有发生

【问题讨论】:

  • 顺便说一句,没有充分的理由将其作为环境变量而不是常规的 shell 变量——而且 POSIX 约定指定了用于变量的全大写变量名称的命名空间,其含义为操作系统和外壳,保留小写名称供应用程序使用。 (正式地,这是为环境变量指定的,但是设置一个常规的 shell 变量会覆盖任何类似命名的环境变量,所以这个约定必须在两个地方都适用)。

标签: linux bash shell unix environment-variables


【解决方案1】:

sh source.sh

...在sh 的单独副本中运行source.sh(实际上,由于您的父shell 是bash 而子shell 是sh,它不仅仅是一个“单独的副本”,而是完全不同的口译员)。当那个单独的解释器退出时,本地变量和对进程本地状态的其他更改就消失了。 (环境变量由子进程继承;它们不会向上传播到父进程。


改为使用:

# POSIX-compliant: execute every command in source.sh in the current shell
. source.sh

...或...

# bash-specific, perhaps more-readable, synonym for the same
source source.sh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2015-02-24
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多