首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk:调用awk之外的函数

awk:调用awk之外的函数
EN

Stack Overflow用户
提问于 2014-02-15 06:15:08
回答 3查看 6.7K关注 0票数 7

更新:

我正在开发一个模块化的shell脚本,它在不同的子进程级别上调用usage()。脚本sample.sh的结构如下所示:

代码语言:javascript
复制
sample.sh
├─ ...
├─ usage()
├─ awk
    ├─ usage()
├─ ...

usage()显示关于如何使用脚本的简短信息(例如,可用的参数及其描述)。当第一次执行时,usage()将显示在脚本的开头。usage()调用的其他条件包括:

  1. awk无法验证来自stdio或文件的输入

  1. 收到参数--help

  1. 发生其他用户派生的故障。

我想从shell及其直接子进程awk调用相同的函数usage()

原题:

函数,usage() of sample.sh按需要打印其打印语句。

代码语言:javascript
复制
$cat sample.sh
#!/bin/sh
awk '
    BEGIN {
        usage()
    }
    function usage() {
        print "function inside of awk"
    }
'
$./sample.sh
function inside of awk

为了从usage()中取出awk并将其作为sample.sh~中的一个本地函数,我尝试:

代码语言:javascript
复制
$cat sample.sh~
#!/bin/sh
usage() {
    print "function outside of awk"
}    
awk '
    BEGIN {
        usage()
    }
'
$./sample.sh~
awk: calling undefined function usage
 source line number 3

正如我们观察到的,我们在sample.sh~中得到了“未定义函数使用”的错误消息。我该如何改进呢?

EN

回答 3

Stack Overflow用户

发布于 2014-02-15 07:21:31

我找到了一种从awk调用函数的方法

将下面的代码放入文件中,例如将其称为a.sh

代码语言:javascript
复制
$ cat a.sh
usage() {
  print "function outside of awk"
 }

$ chmod +x a.sh

然后,您可以在awk中调用该函数。

代码语言:javascript
复制
#!/bin/sh
awk '
    BEGIN {
       system(". a.sh;usage")
    }'
票数 4
EN

Stack Overflow用户

发布于 2014-02-15 06:33:24

子进程不能调用父进程中的函数,反之亦然。即使用同一种语言也不行。

您可以做的是启动包含awk脚本的shell脚本的另一个实例。例如,将其保存在一个名为./script.sh的脚本中

代码语言:javascript
复制
#!/bin/sh -e

usage() {
    echo usage: ...
    exit 1
}

test "$1" = --usage && usage

awk -v usage_script="$0" '
function usage() { system(usage_script " --usage") }
BEGIN {
    usage()
}'

使其可执行,并以./script.sh的形式运行。在这个脚本中,内部usage脚本中的awk函数简单地用--usage脚本重新运行包含的shell脚本。请记住,这里有三个进程: shell、->、awk、->、shell。这是不可能在一个单一的过程中完成的。

原始答案

如果将usage函数定义移至awk之外,则无法从内部执行这是正常的。如果您想执行awk命令,您必须在awk解释器中,并且只能使用内部定义的内容。

注意,如果这是您想要的,但是您可以将函数定义移动到另一个awk文件,并让awk处理它,例如:

代码语言:javascript
复制
cat <<EOF > functions.awk
function usage() {
    print "function in functions.awk"
}
EOF
awk -f functions.awk -e '
    BEGIN {
        usage()
    }
'
票数 2
EN

Stack Overflow用户

发布于 2014-02-16 23:15:20

使用bash,另一个选项是使用export -f导出shell函数,然后通过system()调用使awk可以使用该函数:

代码语言:javascript
复制
#!/usr/bin/env bash

usage() {
  echo "function outside of awk"
}

# Export the usage() function.
export -f usage

awk '
  BEGIN { 
    system("/usr/bin/env bash -c usage") 
  }'

请注意,awk使用system()调用sh,这可能是bash,也可能不是bash--如果是bash (例如在OSX上),则严格地不需要/usr/bin/env bash -c部分,但保留它在大多数平台(有bash的平台)上应该可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21794119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档