我在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上无法运行...
答案 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"
注意:这将替换所有方括号,而不仅仅是前导和尾随。如果您只想做前导和尾随,请查看三位一体的答案。