2016-05-27 18 views
0

私は、アプリケーションで使っているかなり大きいbash関数ライブラリを持っています。ライブラリは環境ファイルとしてインポートされます。関数はエクスポートされるので、他のbashスクリプトでこれらの関数を問題なく使用できます。awkでbash関数をインポート/使用できますか?

しかし、awkスクリプトレットを使用する必要がある別の問題があります。可能であれば、bashライブラリからいくつかの関数を使用できるようにしたいと考えています。

だから、要するに、私は2つのいずれかを行うことができるようにしたい:

  1. にはawkでのbash環境ファイルにawkスクリプト内の
  2. インポート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を返す場合のみです。

+2

この例をMCVEにすることができますか?コードは**完全**かつ**検証可能**である必要がありますか?そうであるように、 's1.awk'に何が含まれているのか分からないので、それが何をしているのかをより良く実践するためのコードを書くことはできません。 –

+0

@ ac1982私は上記の "あなたは**他のbashスクリプト**でこれらの機能を何も問題なく使うことができます**"(強調しています)と言っています。** awkはbash **ではありません。あなたがbashからCプログラムを呼び出すことができるのと同じように、bashから呼び出すことができますが、Cのbashを作成しないので、Cプログラムからbash関数にアクセスすることはできません。 –

+0

このコードを見れば、「awkを使う必要はありません。あなたがネイティブのbashでできなかったawkで何をしていますか? –

答えて

4

いいえ、できません。

あなたはあなたの親シェルから関数をエクスポートするexport -fを使用することができ、その後、子プロセスとしてのawkからのbashの別のインスタンスを実行します。しかし、これはハッカーの高さに非常に近いところです。あなたが実際に達成しようとしていることについての詳細を与えられれば、より確実な方法を見つけることができます。

もっと良い方法は、awkスクリプトを構造化して、シェルネイティブコードを読み書きできるストリームを作成することです。BashFAQ #1を参照してください。 。

関連する問題