从makefile传递两个命令不起作用

时间:2019-02-11 09:50:53

标签: linux bash makefile gnu-make

我在makefile中使用了以下命令

apps := $(shell fzr provide apps )
apps := $(subst ],,$(subst [,,$(apps)))

在命令中获取值数组 并从其中删除数组[]

我想在终端中运行此命令,并使用以下命令

fzr provide apps | (subst ],,$(subst [,,$(apps))) | $(apps)

我出错了

bash: apps: command not found
bash: apps: command not found
bash: subst: command not found
bash: subst: command not found

我在这里想念什么?

如果我只跑

fzr provide apps

我知道了,能正常工作

[app1 app2 app3]

想法是检查命令

apps := $(subst ],,$(subst [,,$(apps)))

可在Mac上运行,但在 windows上无法运行...

3 个答案:

答案 0 :(得分:2)

在Makefile中有效的命令在终端提示符下无效。

如果要删除Bash脚本中的前方括号和后方方括号,请尝试

fzr provide apps |
sed 's/^\[//;s/\]$//'

如果要将其放在Makefile中,请注意,您需要将美元符号加倍(make本身会对单个美元符号求值;将其加倍则将其通过文字美元符号传递)到外壳)。

apps := $(shell fzr provide apps | sed 's/^\[//;s/\]$$//')

您的Makefile使用特定于GNU Make的语法;也许您在Windows上使用的make版本不是GNU兼容版本。

答案 1 :(得分:1)

这是@tripleee发布的脚本的较短版本:

fzr provide apps | tr -d '[]'

这会删除输入字符串中出现的[]个字符。

答案 2 :(得分:1)

在您的makefile中,$(apps)扩展为makefile变量apps的值。这是在makefile读取时完成的,并且在执行shell命令之前替换了该值(因此,shell从不会看到$(apps),而是看到appval1或任何碰巧的应用程序。

在外壳程序中(我假设是bash外壳程序),$(apps)表示运行命令apps。如果需要shell变量的值,则必须使用${apps}。另外,$(subst)是一个make构造,并且外壳程序也不理解,所以您必须用某些内容替换(可能是sed)。

因此,在这种情况下,您需要执行以下操作:

fzr provide apps | sed "s/[][]//g"

注意:这将替换所有方括号,而不仅仅是前导和尾随。如果您只想做前导和尾随,请查看三位一体的答案。