【问题标题】:Why isn't export working from bash script为什么不能从 bash 脚本导出
【发布时间】:2015-05-12 06:08:37
【问题描述】:

为什么在以下情况下无法导出变量:

在以下示例中,我导出 PARAM 变量并将睡眠时间设置为 1000 秒,以便在后台将脚本作为进程运行。

#!/bin/bash

export PARAM="I AM A REAL VALUE"

sleep 1000

所以我按照以下流程执行脚本:

 /tmp/example.bash &

现在脚本作为一个进程运行(我用ps -ef检查了它),我想从Linux控制台打印$PARAM,如下所示

 echo $PARAM

但 PARAM 变量没有值。

为什么?脚本进程运行时,脚本中的 export 未导出值。

【问题讨论】:

  • 因为您的脚本生成了一个新的子 shell,然后您返回父 shell 并检查变量。
  • 您正在 subshel​​l 下运行脚本。 subshel​​l 不能改变父 shell 环境(至少没有任何 hack。)你需要source它。
  • 那么从控制台打印变量的方法是什么?或来自其他脚本
  • 使用. 命令或(在 Bash 或 C shell 中)source 命令来读取文件。 OTOH,您可能不想等待超过 15 分钟才能看到结果;失去sleep 1000
  • 您好,请写下您的答案,以便我为您的解决方案投票

标签: linux bash shell variables export


【解决方案1】:

当您运行 /tmp/example.bash & 时,您在子 shell 中设置环境,但这不会影响运行它的父 shell。

您需要 (a) 删除 sleep 1000 和 (b) 使用 . 命令或(在 Bash 或 C shell 中)source 命令作为当前进程的一部分读取文件:

sed -i.bak '/sleep/d' /tmp/example.bash  # GNU or BSD sed
. /tmp/example.bash
echo $PARAM

【讨论】:

  • 你应该写这个。 ./tmp/example.bash(你忘记了“.”)
  • 问题中/tmp/example.bash前面没有.,所以不是我忘记了前导点。但是修复文件名以匹配您的本地要求几乎不是火箭科学。在使用文件的任何 SO 答案中,几乎都假定它是必要的——修改名称以满足实际位置名称。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 2017-04-23
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多