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{}. /block 만 있으면 BEGIN입력이 없습니다 END.

Linux 시스템에서 실행 중이기 때문에 일반 ( 또는 유사한) gawk대신에 사용하고 있을 가능성이 높습니다 . 이는 거의 확실하게 제가 추측한 버전 4 확장이기도 합니다. ;-) 어떤 경우에는 사용할 수 있습니다awknawkmawk-egawk@include이렇게 하면 일부 코드가 제거됩니다. 그렇지 않은 경우 다른 awk 래퍼 스크립트의 경우igawk포함 기능을 구현하는 더 깔끔한 방법인 것 같습니다.

관련 정보