更新:
我正在开发一个模块化的shell脚本,它在不同的子进程级别上调用usage()。脚本sample.sh的结构如下所示:
sample.sh
├─ ...
├─ usage()
├─ awk
├─ usage()
├─ ...usage()显示关于如何使用脚本的简短信息(例如,可用的参数及其描述)。当第一次执行时,usage()将显示在脚本的开头。usage()调用的其他条件包括:
awk无法验证来自stdio或文件的输入--help我想从shell及其直接子进程awk调用相同的函数usage()。
原题:
函数,usage() of sample.sh按需要打印其打印语句。
$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~中的一个本地函数,我尝试:
$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~中得到了“未定义函数使用”的错误消息。我该如何改进呢?
发布于 2014-02-15 07:21:31
我找到了一种从awk调用函数的方法
将下面的代码放入文件中,例如将其称为a.sh
$ cat a.sh
usage() {
print "function outside of awk"
}
$ chmod +x a.sh然后,您可以在awk中调用该函数。
#!/bin/sh
awk '
BEGIN {
system(". a.sh;usage")
}'发布于 2014-02-15 06:33:24
子进程不能调用父进程中的函数,反之亦然。即使用同一种语言也不行。
您可以做的是启动包含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的形式运行。在这个脚本中,内部usage脚本中的awk函数简单地用--usage脚本重新运行包含的shell脚本。请记住,这里有三个进程: shell、->、awk、->、shell。这是不可能在一个单一的过程中完成的。
原始答案
如果将usage函数定义移至awk之外,则无法从内部执行这是正常的。如果您想执行awk命令,您必须在awk解释器中,并且只能使用内部定义的内容。
注意,如果这是您想要的,但是您可以将函数定义移动到另一个awk文件,并让awk处理它,例如:
cat <<EOF > functions.awk
function usage() {
print "function in functions.awk"
}
EOF
awk -f functions.awk -e '
BEGIN {
usage()
}
'发布于 2014-02-16 23:15:20
使用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--如果是bash (例如在OSX上),则严格地不需要/usr/bin/env bash -c部分,但保留它在大多数平台(有bash的平台)上应该可以工作。
https://stackoverflow.com/questions/21794119
复制相似问题