在制作文件中使用管道

时间:2019-01-17 17:50:08

标签: bash makefile

我正在尝试创建使用管道的make命令。但是命令没有按预期执行。

示例

SHELL:=/bin/bash

all:
    $(shell ps aux | grep -i someProcName)

输出:

bash: kls602: command not found
grep: kls602: No such file or directory
grep: 46905: No such file or directory
grep: 0.0: No such file or directory
grep: 0.0: No such file or directory
grep: 4306668: No such file or directory
grep: 6480: No such file or directory
grep: s008: No such file or directory
grep: S: No such file or directory
grep: 12:22PM: No such file or directory
grep: 0:00.57: No such file or directory
...

好像ps的输出已作为要在grep命令中搜索的文件。我不知道自己在做什么错。

那么,如何在make中编写半复杂的bash命令?我希望有一个比“仅运行bash脚本而不是将命令放在makefile中”的更好的答案。

1 个答案:

答案 0 :(得分:3)

在配方中使用$(shell...)是一种反模式。除非在最不寻常的,奇怪的情况下,否则您永远都不要这样做。食谱 IS 是一个外壳脚本,因此运行$(shell ...)充其量是多余的。

第二,阅读the shell function的作用:

  

shell函数执行的功能与大多数shell中的反引号('`')相同:它会执行命令扩展。这意味着它将shell命令作为参数并求值到命令的输出。

所以您对正在发生的事情的理解是完全正确的,而这正是它应该做的。

您应该这样简单地写:

all:
        ps aux | grep -i someProcName