从生成文件管道两个命令不工作

问题描述 投票:0回答:3

我用下面的命令在我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它不是...

linux bash makefile gnu-make
3个回答
2
投票

这是有效的在生成文件的命令不在终端提示有效的。

如果你想删除的bash脚本的开头和结尾的方括号,尝试

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

如果你想把他们在Makefile,请注意,您需要将美元符号的两倍(一个美元符号得到由make自身评估;加倍它通过文字美元符号的外壳)。

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

Makefile使用的语法,专用于GNU制作;也许你在Windows上的make版本不是GNU兼容的一个。


1
投票

下面是@tripleee张贴稿件的较短的版本:

fzr provide apps | tr -d '[]'

无论他们出现在输入字符串这消除[]字符。


1
投票

在你的makefile,$(apps)扩展到makefile文件变量apps的价值。这是在生成文件的读出时间进行,并执行外壳命令之前的值被取代的(因而壳永远不会看到$(apps),而是看见appval1,或任何应用恰好是。

在壳,(我假设一个bash壳),$(apps)装置运行命令apps。如果你想在shell变量的值,你必须使用${apps}。此外,$(subst)是一个让结构,壳不明白,要么,所以你必须替换的东西(可能sed)。

因此,在这种情况下,你需要做的是这样的:

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

注:此代替所有方括号,而不只是开头和结尾。如果你想只是做前端和后端的,看到tripleee的答案。

© www.soinside.com 2019 - 2024. All rights reserved.