gpt4 book ai didi

linux - 我可以在 awk 中导入/使用 bash 函数吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:34 25 4
gpt4 key购买 nike

我有一个在应用程序中使用的相当大的 bash 函数库。该库作为环境文件导入。由于函数已导出,我可以在其他 bash 脚本中使用这些函数而不会出现任何问题。

但是我还有另一个问题,我需要使用 awk scriptlet,并且如果可能的话,我希望能够使用 bash 库中的几个函数。

所以简而言之,我希望能够做以下两件事之一:

  1. 在awk中使用bash环境文件中的函数
  2. 在 awk 脚本中导入 bash 环境文件并使用任何变量和/或使用该环境文件导出的函数。

作品:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# set -o posix;OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test;check_flag RAD
[root@test@Test1001 scripts]# echo $?
0

不起作用:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# awk -v st=ssa -v 'env=OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test' -f /tmp/s1.awk /tmp/template.mf
bash: check_flag: No such file or directory 127

s1.awk

BEGIN {
FS=":"
if (system("set -o posix;"env)!=0) {
print "***ERROR - ENV string not valid to shell - cannot continue"
exit 1
}
}

/^[[:space:]]*#/{next}
/^[[:space:]]*$/{next}

{
# field 3 processing
n_a=split($3,a_st,",")
# field 4 re-glue around ":" if required
cmd=$4
for (i=5; i<=NF; i++) cmd=cmd":"$i
if (cmd) cmd="set -o posix;"env";"cmd
f=0;for (i=1; i<=n_a && !f; i++) if (a_st[i]==st) f=1
print "CMD: "cmd
if ($3=="" || $3=="*" || f)
system(cmd)
}

mf文件:

text:S3:rcs,ssa:check_flag RAD

我希望仅当“check_flag RAD”返回 true 时才能够处理上面的行。

最佳答案

不,你不能。

可以使用export -f 从您的父shell 导出函数,然后从awk 运行另一个bash 实例作为子进程。然而,这已经接近 hackery 的顶峰了。提供有关您实际打算完成的内容的更多详细信息,我们几乎可以肯定会找到更好的实践方法。

更好的实践方法是构造您的 awk 脚本以编写一个流,您的 shell native 代码可以从中读取流并对其进行操作 -- 参见 BashFAQ #1有关逐字段读取输入流的最佳实践。

关于linux - 我可以在 awk 中导入/使用 bash 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com