私は、アプリケーションで使っているかなり大きいbash関数ライブラリを持っています。ライブラリは環境ファイルとしてインポートされます。関数はエクスポートされるので、他のbashスクリプトでこれらの関数を問題なく使用できます。awkでbash関数をインポート/使用できますか?
しかし、awkスクリプトレットを使用する必要がある別の問題があります。可能であれば、bashライブラリからいくつかの関数を使用できるようにしたいと考えています。
だから、要するに、私は2つのいずれかを行うことができるようにしたい:
- が にはawkでのbash環境ファイルにawkスクリプト内の
- インポートbashの環境ファイルを関数を使用し、任意の変数を使用および/または その環境ファイルを使用してエクスポートされた関数。
作品:
[[email protected]@Test1001 scripts]# . mfg.env
[[email protected]@Test1001 scripts]# set -o posix;OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test;check_flag RAD
[[email protected]@Test1001 scripts]# echo $?
0
は動作しません:
[[email protected]@Test1001 scripts]# . mfg.env
[[email protected]@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を返す場合のみです。
この例をMCVEにすることができますか?コードは**完全**かつ**検証可能**である必要がありますか?そうであるように、 's1.awk'に何が含まれているのか分からないので、それが何をしているのかをより良く実践するためのコードを書くことはできません。 –
@ ac1982私は上記の "あなたは**他のbashスクリプト**でこれらの機能を何も問題なく使うことができます**"(強調しています)と言っています。** awkはbash **ではありません。あなたがbashからCプログラムを呼び出すことができるのと同じように、bashから呼び出すことができますが、Cのbashを作成しないので、Cプログラムからbash関数にアクセスすることはできません。 –
このコードを見れば、「awkを使う必要はありません。あなたがネイティブのbashでできなかったawkで何をしていますか? –