Go Makefile中bash命令的用法

时间:2018-08-09 02:46:12

标签: bash macos go makefile

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

但是,该方法从根本上来说是有缺陷的,因为它会陷入影响parsing ls output的极端情况的深渊。一种更健壮的方法是使用Make函数来表达模式。

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

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