无法通过 Makefile 使用 shell 管道?

Unable to use shell pipe via Makefile?

我有一个 shell 命令 spurious ports 其中 returns 以下数据...

Service                      Host                         Port   Browser link
spurious-elasticache-docker  192.168.59.103               32794  -
spurious-sqs                 sqs.spurious.localhost       32789  http://sqs.spurious.localhost:32789
spurious-s3                  s3.spurious.localhost        32790  http://s3.spurious.localhost:32790
spurious-elasticache         192.168.59.103               32793  -
spurious-dynamo              dynamodb.spurious.localhost  32791  http://dynamodb.spurious.localhost:32791
spurious-browser             browser.spurious.localhost   32795  http://browser.spurious.localhost:32795
spurious-memcached           192.168.59.103               32792  -

如果我想获取 "dynamo" 服务的端口号,那么下面的 shell 脚本可以工作...

lines=`spurious ports`; echo $lines | grep "dynamo" | awk '{print }'

这会返回 32791

但是如果我尝试从 Makefile 中 运行 这个,我反而会得到整个 spurious ports 输出(全部在一行上?):

foobar:
    $(eval port:=$(shell lines=`spurious ports`; echo $$lines | grep 'dynamo' | awk '{print }'))
    @echo $(port)

我也试过将命令移动到 shell 脚本文件中:

#!/bin/sh
lines=`spurious ports`; echo $lines | grep "dynamo" | awk '{print }'

在 Makefile 中使用:

PORT:=$(shell ./scripts/spurious-ports.sh)
bing:
    @echo $(PORT)

但这也不行。

这似乎是引用问题。当您使用多行变量时,您需要将该变量放在双引号中以保留行尾的 /n。

例如

 VAR="1
 2
 3
 4"
 echo $VAR   ## here it will print "1 2 3 4"

 but echo "$VAR" will print 

 1
 2
 3
 4

我认为这会解决您的问题。有关详细信息,请阅读 shell.

中的引号