我有一个相当大的bash函数库,我在应用程序中使用。库将作为环境文件导入。由于函数已导出,因此我可以在其他 bash 脚本中使用这些函数,而不会出现任何问题。
但是我还有另一个问题,我需要使用 awk 脚本,如果可能的话,我希望能够使用 bash 库中的几个函数。
简而言之,我希望能够做以下两件事之一:
- 在 awk 中的 bash 环境文件中使用该函数
- 在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 实例作为子进程。然而,这接近黑客的高度;鉴于您实际打算完成的更多细节,我们几乎可以肯定地找到更好的实践方法。
更好的做法是构建您的 awk 脚本以编写您的 shell 原生代码可以从中读取和操作的流 - 请参阅 BashFAQ #1 了解逐字段读取输入流的最佳实践。