Bash awk:在awk之外调用函数 更新:

Bash awk:在awk之外调用函数 更新:,bash,shell,awk,Bash,Shell,Awk,我正在编写一个模块化的shell脚本,它在不同级别的子流程中调用usage()。脚本sample.sh的结构如下所示: sample.sh ├─ ... ├─ usage() ├─ awk ├─ usage() ├─ ... usage()显示有关如何使用脚本的简要信息(例如可用参数及其说明)。第一次执行时,脚本开头会显示usage()。usage()调用的其他条件示例包括: awk无法验证来自stdio或文件的输入 收到参数--帮助 发生其他用户派生的故障 我想从shell及其

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

sample.sh
├─ ...
├─ usage()
├─ awk
    ├─ usage()
├─ ...
usage()
显示有关如何使用脚本的简要信息(例如可用参数及其说明)。第一次执行时,脚本开头会显示
usage()
usage()
调用的其他条件示例包括:

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

  • 收到参数
    --帮助

  • 发生其他用户派生的故障

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


    原始问题: 函数,
    sample.sh的
    usage()

    $cat sample.sh
    #!/bin/sh
    awk '
        BEGIN {
            usage()
        }
        function usage() {
            print "function inside of awk"
        }
    '
    $./sample.sh
    function inside of awk
    
    要从
    awk
    中取出
    usage()
    ,并将其作为本地函数放入
    sample.sh~
    ,我尝试了以下操作:

    $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~
    中得到错误消息“undefined function usage”。如何改进它?

    子进程不能调用父进程中的函数,反之亦然。甚至不是用同一种语言

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

    #!/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
    运行。在此脚本中,内部
    awk
    脚本中的
    usage
    函数只需使用
    --usage
    脚本重新运行包含的shell脚本。请记住,这里将有3个进程:shell->awk->shell。在一个过程中不可能做到这一点

    原始答案

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

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

    cat <<EOF > functions.awk
    function usage() {
        print "function in functions.awk"
    }
    EOF
    awk -f functions.awk -e '
        BEGIN {
            usage()
        }
    '
    

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

    将下面的代码放在一个文件中,例如call a.sh

    $ cat a.sh
    usage() {
      print "function outside of awk"
     }
    
    $ chmod +x a.sh
    
    然后可以在awk中调用该函数

    #!/bin/sh
    awk '
        BEGIN {
           system(". a.sh;usage")
        }'
    

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

    #!/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
    (例如,在OSX上),您不需要严格地使用
    /usr/bin/env bash-c
    部分,但保留它应该可以使它在大多数(具有bash的)平台上工作.

    awk不是外壳,就像C不是外壳一样。您不应该期望能够在awk之外调用shell函数,正如您不能在C之外调用shell函数一样。如果您通过一些示例输入和预期输出告诉我们您想要做什么(而不是如何做),我们可以帮助您。感谢您的输入。请看我更新的问题。只有当
    usage()
    显示专门针对
    awk
    范围的信息时,您的答案才是好的。我的目的是显示有关shell的一般用法信息。如果我将
    usage()
    放在
    awk
    中,我将不得不调用
    awk
    来调用
    usage()
    之外的
    awk