【发布时间】:2012-08-12 21:23:09
【问题描述】:
第一次在这里发帖,但多年来一直是潜伏者。我已经用谷歌搜索了很长时间,但找不到我想要的东西(许多不要求该主题暗示它的主题的大主题......)。对 awk 或脚本并不陌生,只是有点生疏:)
我正在尝试编写一个 awk 脚本,该脚本将在运行时设置 shell env 值 - 以便稍后获取另一个 bash 脚本并使用。我不能简单地使用 awk 的标准输出来报告我想要设置的这个值(即“导出任何东西=awk cmd here”),因为那已经指向 awkscript 正在创建的“结果文件”(另外我有多个变量要无论如何导出最终代码)。
作为一个示例测试脚本,来演示我的问题:
echo $MYSCRIPT_RESULT # returns nothing, not currently set
echo | awk -f scriptfile.awk # do whatever, setting MYSCRIPT_RESULT as we go
echo $MYSCRIPT_RESULT # desired: returns the env value set in scriptfile.awk
在 scriptfile.awk 中,我尝试过(没有成功)
1/) 直接构建和执行临时字符串:
{
cmdline="export MYSCRIPT_RESULT=1"
cmdline
}
2/) 使用系统函数:
{
cmdline="export MYSCRIPT_RESULT=1"
system(cmdline)
}
...但是这些不起作用。我怀疑这两个命令在 awk 正在执行的 shell 中创建了一个子 shell,并按照我的要求做(通过触摸文件作为测试证明),但是一旦“cmd”/系统调用完成,子 shell 就会死掉,不幸的是使用我设置的任何内容 - 所以我的环境设置更改不会从“awk 的调用者”的角度坚持。
所以我的问题是,您如何在 awk 中直接设置环境变量,以便在 awk 执行完成后调用进程可以访问这些环境值?真的有可能吗?
除了上面的 adhoc/system 方式,我已经证明它对我来说是失败的,我看不到如何做到这一点(除了将这些值写入某个“随机”文件以供调用方获取和读取脚本,反正 imo 有点脏),因此,帮助!
欢迎所有想法/建议/cmets!
【问题讨论】:
-
不行。这是操作系统环境的基本规则,子进程可以更改它们的环境,但不能更改其父进程的环境。您可以做的最好的事情是(来自 shell 脚本)
myParentVar=$( echo "$myParentVar" | awk '{sub(/xxxx/, "yyyy", $0); print $0}' )(其中sub(...)是您想要对 $myParetntVar 进行的任何修改的占位符。祝您好运。 -
感谢您的回复。我很害怕会出现这种情况(父/子环境设置和影响范围),所以认为我将不得不为这些环境变量使用临时文件,以便调用 bash 脚本访问。谢谢你确认我的想法:(
-
我也遇到了这个问题。我所做的是将 awk 输出写入临时文件,然后获取临时文件。作品。不确定它是否优雅但仍然非常单一。
标签: awk