Go Makefile中bash命令的用法

通过命令行(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 listed

grep在Go Makefile中使用和类似命令的正确方法是什么?


胡子哥哥
浏览 270回答 2
2回答

手掌心

美元符号具有特殊的制造意义:它们引入了make变量和函数。如果要在配方中使用文字美元符号,则需要通过将其加倍来对其进行转义:start:         go run $$(ls -1 dir/*.go | grep -v _test.go)

慕雪6442864

正如在另一个答案中已经提到的那样,简单的解决方案是将所有美元符号加倍,以防止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函数名称并找出代码的作用!)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go