
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{}
。 /ブロックのみが入力されてBEGIN
いませんEND
。
Linuxシステムで実行されているため、通常(または類似)の代わりgawk
に使用している可能性が高いです。これはほぼ確実に私が推測したバージョン4拡張でもあります。 ;-) 場合によっては使用できますawk
nawk
mawk
-e
gawk
@include
これにより、一部のコードが削除されます。それ以外の場合は、他のawkラッパースクリプトの場合igawk
インクルード機能を実装するよりきれいな方法のようです。