为了账号安全,请及时绑定邮箱和手机立即绑定

Go Makefile中bash命令的用法

Go Makefile中bash命令的用法

Go
胡子哥哥 2021-03-31 15:46:10
通过命令行(MacOS)_test.go使用时,可以排除文件go run。go run $(ls -1 dir/*.go | grep -v _test.go)但是,似乎通过Go makefile并没有以类似的方式使用该命令。例如,start:     go run $(ls -1 dir/*.go | grep -v _test.go)和start:     go run `$(ls -1 dir/\*.go | grep -v _test.go)`两者都会导致go run: no go files listedgrep在Go Makefile中使用和类似命令的正确方法是什么?
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

美元符号具有特殊的制造意义:它们引入了make变量和函数。如果要在配方中使用文字美元符号,则需要通过将其加倍来对其进行转义:

start:
        go run $$(ls -1 dir/*.go | grep -v _test.go)


查看完整回答
反对 回复 2021-04-19
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

正如在另一个答案中已经提到的那样,简单的解决方案是将所有美元符号加倍,以防止Make尝试将它们解释为Make变量或函数。等效地,您可以将过时的命令替换语法`ls ... stuff`与反引号一起使用,而不是 $(ls ... stuff)

但是,这种方法从根本上来说是有缺陷的,因为它陷入影响解析ls输出的极端情况的深渊。一种更可靠的方法是使用Make函数来表达模式。

go run $(filter-out %_test.go,$(wildcard dir/*.go))

我还将提到Bash具有一个称为扩展的globlob(google extglob)的功能,您可以在其中说一些类似于!(dir/*_test.go)dir/*.go从通配符匹配中排除文件集的内容。但是,当Make具有提供相同功能的内置功能时,您可能不想破坏Makefile的可移植性(尽管语法更为冗长。实际上,这是一个功能,因为它使新维护者可以轻松地进行操作) google函数名称并找出代码的作用!)


查看完整回答
反对 回复 2021-04-19
  • 2 回答
  • 0 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信