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
. 또는 exit
final 의 끝에서 호출 하는 경우 BEGIN
코드를 블록에 넣을 수 있습니다 END{}
. /block 만 있으면 BEGIN
입력이 없습니다 END
.
Linux 시스템에서 실행 중이기 때문에 일반 ( 또는 유사한) gawk
대신에 사용하고 있을 가능성이 높습니다 . 이는 거의 확실하게 제가 추측한 버전 4 확장이기도 합니다. ;-) 어떤 경우에는 사용할 수 있습니다awk
nawk
mawk
-e
gawk
@include
이렇게 하면 일부 코드가 제거됩니다. 그렇지 않은 경우 다른 awk 래퍼 스크립트의 경우igawk
포함 기능을 구현하는 더 깔끔한 방법인 것 같습니다.