【问题标题】:Piping two command from makefile is not working从makefile管道两个命令不起作用
【发布时间】:2019-02-11 09:50:52
【问题描述】:

我在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 中不是...

【问题讨论】:

  • 您是否尝试在 Windows 上运行此命令?你是如何在那里设置bash 的? Windows 有自己的命令行语言(实际上有两种),但默认情况下bash 不是其中之一。
  • @JennyM :错误信息的意思是,你想执行一个名为apps的命令,并且在你的PATH中列出的任何目录中都没有这个名字的可执行文件,也不是一个函数或别名。作为第一步,我将在命令执行时调查 PATH 的值,并验证该文件是否存在并且是否设置了 x 位。
  • @JennyM :除此之外,即使它们是 PATH 中同名的命令,$(apps) 表达式也有点不寻常:这意味着 调用命令 apps,并将该命令的标准输出视为新命令的名称,接下来调用该命令并接收管道的输入 ...您确定这是您想要做的吗?

标签: linux bash makefile gnu-make


【解决方案1】:

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

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

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

如果你想把它放在Makefile 中,请注意你需要将美元符号加倍(单个美元符号由make 本身评估;加倍它通过文字美元符号传递给外壳) .

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

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

【讨论】:

  • 谢谢,我试试看告诉你:),顺便说一下我从这里下载的windows,gnuwin32.sourceforge.net/packages/make.htm,兼容吗?
  • 我无法测试它,但封面上说它是 GNU Make。
  • 如果我想在 makefile 中使用它,fzr provide apps | sed 's/^\[//;s/\]$//' 这应该可以吗?
  • 我在一分钟前更新了我的答案以涵盖该问题(^:
  • Makefile 显然不能使用任何没有安装在你的 Windows 机器上的命令。找到 Windows sed 并不难,但如果您想避免引入大量依赖项,恢复到 $(subst ...) 可能更简单。但是,没有明智的方法可以在 Windows 和真实计算机之间移植非平凡的 Makefile
【解决方案2】:

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

fzr provide apps | tr -d '[]'

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

【讨论】:

    【解决方案3】:

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

    在 shell 中(我假设是 bash shell),$(apps) 表示运行命令 apps。如果你想要 shell 变量的值,你必须使用${apps}。此外,$(subst) 是一个 make 构造,shell 也不理解它,所以你必须用一些东西替换它(可能是 sed)。

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

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

    注意:这将替换所有方括号,而不仅仅是前导和尾随。如果您只想做前导和尾随,请参阅 Tripleee 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2016-08-22
      • 2017-06-03
      相关资源
      最近更新 更多