无法通过 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.
中的引号
我有一个 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.
中的引号