【问题标题】:Shell script to set environment variables设置环境变量的shell脚本
【发布时间】:2013-09-04 01:36:41
【问题描述】:

我想写一个shell脚本来导出变量。

下面我列出了脚本。

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

但这似乎不能正常工作。我必须在 shell 提示符下单独执行命令。

【问题讨论】:

标签: shell


【解决方案1】:

您需要以source 或简写. 运行脚本

source ./myscript.sh

. ./myscript.sh

这将在现有 shell 中运行,确保脚本创建或修改的任何变量在脚本完成后可用。

仅使用文件名运行脚本将在单独的子 shell 中执行脚本。

【讨论】:

  • 通过使用 source ./setenv.sh -: 给出未找到源的错误。并通过使用 . ./setenv.sh 它给出的无法打开 setenv.sh。你能帮我解决这个问题吗?谢谢
  • 让我头疼了一个小时,为什么那些该死的导出变量不存在 (zsh) 尝试typeset -gx、导出等并且有我的 wtf?时刻 - 不知道子shell是用自己的范围执行的。感谢我从即将发生的愤怒管理失误中拯救了我的一天
  • 有没有办法使用继承的变量运行脚本,但不允许它在外壳中改变变量?
【解决方案2】:

请向我们展示脚本的更多部分,并告诉我们您必须单独执行哪些命令并且想要简单地执行。

同时你必须使用双引号而不是单引号来扩展变量:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

单个命令末尾的分号也是不必要的。

到目前为止:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

对于su,您可以使用:

su -c 'sh /path/to/script.sh'

注意:OP 没有明确要求有关如何使用 shell 脚本在交互式 shell 中创建导出变量的步骤。他最多只要求对他的剧本进行评估。他没有提到如何使用他的脚本的细节。可能是在交互式 shell 中使用 .source。它可能是一个独立的 scipt,或者它可能是来自另一个脚本的source'd。环境变量并非特定于交互式 shell。这个答案解决了他的问题。

【讨论】:

  • 你好 konsolebox !非常感谢 。但我不明白其中的区别.. export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH" 用双引号括起来。 & export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' 用单引号括起来。你修改的脚本运行良好。
  • @PragRao 参数扩展根本不会发生在单引号中。您可以解释有关进一步引用here 的详细信息。
  • @konsolebox 问题名称听起来像“Shell script to set environment variables”——大多数社区发现这个问题只是为了解决从当前 shell 运行这种脚本的问题(source.)。感谢您准确回答 OP 的问题,但我从谷歌找到了这个主题,下一个答案对我的帮助比你的更大。赞成第二个答案(source. 确认我的意见...
  • @avtomaton 同样,这与在 Google 上找到它的其他人无关。这只是关于问题的原始方法。如果您对如何更改问题或如何呈现答案有疑虑,请考虑在元数据中进行讨论。
【解决方案3】:

以 source= 身份运行脚本以在调试模式下运行。

source= ./myscript.sh

【讨论】:

    【解决方案4】:

    我无法用source ./myscript.sh 解决它。它说找不到源错误。
    使用. ./myscript.sh 时也失败。它给出了无法打开 myscript.sh。

    所以我的选择是将它放在一个文本文件中,以便在下一个脚本中调用。

    #!/bin/sh
    echo "Perform Operation in su mode"
    echo "ARCH=arm" >> environment.txt
    echo "Export ARCH=arm Executed"
    export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
    echo "Export path done"
    export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
    echo "Export CROSS_COMPILE done"
    # continue your compilation commands here
    ...
    

    在需要时调用它:

    while read -r line; do
        line=$(sed -e 's/[[:space:]]*$//' <<<${line})
        var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
        if [ -z "$(test)" ];then eval export "$line";fi
    done <environment.txt
    

    【讨论】:

    • 您可以修改 myscript.sh 使其生成一个名为 environment.sh 的文件(带有导出语句),然后在需要时只需 source environment.sh 而不是 while 循环。
    【解决方案5】:

    在我的例子中,我在= 之前和之后给出了额外的空格。 例如,在我的 shell 文件中(比如deploy.sh

    我最初写

    GIT_SHA = $(git rev-parse HEAD)
    

    但我使用以下方法修复了它:

    GIT_SHA=$(git rev-parse HEAD)
    

    所以请注意,我们不应该在=之前和之后给任何空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多