awk ファイルに start 文がある場合、awk 関数は呼び出されません。

awk ファイルに start 文がある場合、awk 関数は呼び出されません。

awk他のファイルをロードするファイルがありますawk。ファイルの基本関数を実行するたびにロードコードを呼び出すのではなく、最初にステートメントのすべての内容をロードしようとしますBEGINが、そうすると関数自体は実行されません。BEGINスクリプトの外部で呼び出されるステートメントと関数はありますか?

私のawkスクリプト:

#! /usr/bin/awk -f

function include(includeFile) {INCLUDE_FILES[includeFile]}
function sourceIncludes()
{
    if(!l)
    {
        getline t < "/proc/self/cmdline"; split(t,T, "\0")
        scriptname=T[3]
        for (i = 1; i < ARGC; i++) 
            args=args " "ARGV[i]
        for(iFile in INCLUDE_FILES )
            inc = inc " -f "iFile
        cmd=sprintf("%s %s -v l=1 -- %s\n",scriptname,inc,args)
        system(cmd); exit
    }
}

function pkginfo(pkg)
{
    { print pkg }
}

BEGIN {
    include("wrap.awk")
    sourceIncludes()
}

package.awkコンテンツ:

#! /usr/bin/awk -f

function wrap(text, q, y, z)
{
    while(text)
    {
        q = match(text, / |$/)
        y += q
        if(y >= 80)
        {
            z = z RS sprintf("%c", 0x2502) #chr(2502)#"\\u2502"
            for(i = 0; i < 20; i++)
                z = z FS
            y = q - 1
        }
        else if(z)
            z = z FS
        z = z substr(text, 1, q - 1)
        text = substr(text, q + 1)
    }
    return z
}

これがbash / zshですべてを呼び出す方法です:

awk -f ~/.ZSH_CUSTOM/awkscripts/pkginfo.awk -e '{ pkginfo("test") }'

ベストアンサー1

exitから呼び出されていますBEGIN{}。つまり、以前のバージョンにないエントリは実行されBEGIN{}ませEND{}ん。

エクスポートせずにコードは

{ pkginfo("test") }

入力行(stdin)が利用可能になるまで実行されません。これがawkの仕組みです。コード(main()例:)を使用して関数を呼び出し、最後のexitブロックの最後でこの問題を解決できますBEGIN

awkかなり一般的な目的ですが、本物入力行を読み、パターンと一致させようとしています。これがあなたのコードが停止しているように見える理由です。

または、次のものを使用できます。

BEGIN { pkginfo("test") }

ただし、すべてのブロックの順序を知る必要があるかもしれませんBEGIN。または、exitfinalの終わりで呼び出す場合は、BEGINコードをブロックに入れることができますEND{}。 /ブロックのみが入力されてBEGINいませんEND

Linuxシステムで実行されているため、通常(または類似)の代わりgawkに使用している可能性が高いです。これはほぼ確実に私が推測したバージョン4拡張でもあります。 ;-) 場合によっては使用できますawknawkmawk-egawk@includeこれにより、一部のコードが削除されます。それ以外の場合は、他のawkラッパースクリプトの場合igawkインクルード機能を実装するよりきれいな方法のようです。

おすすめ記事