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