这里第一篇文章,但一直是一个潜伏的年龄。我已经搜索了很长时间,但无法找到我想要的东西(许多不需要主题建议它的主题主题......)。不是新的awk或脚本,只是有点生疏:)awk:直接从awk脚本中设置环境变量
我想写一个awk脚本,它将设置shell env值,因为它运行 - 另一个bash脚本来拿起和使用后。我不能简单地使用awk的stdout来报告我想设置的值(即“export whatever = 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内,我已经试过(不sucess)
1 /)建设和直接执行即席字符串:
{
cmdline="export MYSCRIPT_RESULT=1"
cmdline
}
2 /)使用系统功能:
{
cmdline="export MYSCRIPT_RESULT=1"
system(cmdline)
}
...但这些不起作用。我怀疑这两个命令是在awk执行的shell的内部创建一个子shell,并且按照我的要求(通过触摸文件作为测试来证明),但是一旦“cmd”/系统调用完成,子shell就会死亡,不幸的是采取我已经设定的任何东西 - 所以我的环境设置变化不会从“awk的调用者”的角度来坚持。
所以我的问题是,你如何真的在awk 内直接设置env变量,以便调用进程可以在awk执行完成后访问这些env值?它实际上可能吗?
除了上面的adhoc/system方法之外,我已经证明对我来说是失败的,我看不出如何做到这一点(除了将这些值写入某个“随机”文件的某个地方以供拾取和读取调用脚本,无论如何imo是有点肮脏),因此,帮助!
欢迎所有意见/建议/意见!
不行。这是操作系统环境的一个基本规则,子进程可以改变它们的**环境,但不改变其父代的环境。你可以做的最好的是,(从shell脚本)'myParentVar = $(echo“$ myParentVar”| awk'{sub(/ xxxx /,“yyyy”,$ 0); print $ 0}')'(where sub (...)'是一个占位符,用于对$ myParetntVar进行任何修改。祝你好运。 – shellter 2012-08-16 14:04:40
thx for the reply。我担心这会是这种情况(父母/孩子的环境设置和影响范围),所以认为我将不得不使用这些env变量的暂存文件来访问调用bash脚本。 thx用于确认我以为无论如何:( – user1603289 2012-08-16 14:19:17
我也有这个问题,我所做的是写awk输出到一个临时文件,然后找到临时文件Works。不知道它是否优雅,但仍然非常unixy – qodeninja 2015-04-04 20:06:55