无法通过Makefile使用shell管道?

时间:2015-05-18 10:26:27

标签: shell makefile

我有一个shell命令spurious ports,它返回以下数据......

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 $3}'

重新调整32791

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

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

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

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

在Makefile中使用:

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

但这也不起作用。

1 个答案:

答案 0 :(得分:0)

这似乎引用了问题。当您使用多行进行变量时,需要将该变量放在双引号中以将/ 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中的引号。