2015-05-18 31 views
0

我有一个shell命令spurious ports返回以下数据...无法通过Makefile使用shell管道?

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 - 

如果我想要得到的“发电机”的服务,然后下面的shell脚本的该端口号...

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

这retuns 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) 

但是,这也不行。

+0

此外,您忘记在awk命令中转义'$';在makefile版本中,您需要使用'awk'{print $$ 3}''。但是,在配方中使用'eval'的事情非常奇怪。 – MadScientist

回答

0

这似乎是引号的问题。当你用多行变量时,你需要用双引号将该变量保留在行尾。

例如,

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中的引号。

+0

谢谢!我会读一读关于它是如何工作的。 – Integralist