[英]How to write shell script for chaincode invoke function for arguments from file?
[英]How to invoke a function in a shell script from a Makefile
我有一个Makefile
,其中包含打印给定变量的目标:
print-%:
@echo $*=$($*)
例如要打印变量CURDIR
的值,我只需发出以下命令:
make print-CURDIR
结果如下:
CURDIR=/Users/j3d/Projects/myproject
现在我想创建一个 shell 脚本,其中包含一组要从任何Makefile
调用的常用函数......这是上面目标的修改版本:
print-%:
. ./make-util printvar $@
这是make-util
:
#!/bin/sh
printvar()
{
@echo $*=$(*)
}
最后,运行上面的脚本......
j3d@j3ds-macbook-pro myproject % make print-CURDIR
...不会产生预期的结果:
. ./make-utils CURDIR
我应该如何调用脚本 function 以便正确打印给定的变量?
您可以创建一套 make recipes(如果您使用 GNU make),您可以在多个 makefile 中包含和使用它,但您必须使用make语法,而不是shell语法,因为它们是 make recipes 即使配方展开后变成 shell 脚本。
您可以研究 GNU make define
语句以及eval
和call
函数,以了解在 GNU make 中创建用户定义函数的方法。 例如,您可以像这样编写 makefile:
$ cat macros.mk
print-%:
@echo $*=$($*)
然后在你的其他makefile中你可以使用:
include macros.mk
并且您会自动获得该规则。
这里有很多很多的可能性,但细节取决于你想做什么。
你快到了:
由于您将 function 的名称作为第一个参数传递,因此您可以执行
#!/bin/sh
printvar()
{
@echo $*=$(*)
}
"$1"
执行 function。 如果您想要更多安全性(以捕获错误传递一些危险命令而不是 function 名称的情况),您可以执行
[ "$1" = printvar ] && printvar
[ "$1" = other_function ] && other_function
反而。
如果要处理脚本 Make-variables,可以将它们作为附加参数传递:
func=$1
shift
[ "$func" = printvar ] && printvar "$@"
[ "$func" = other_function ] && other_function "$@"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.