2014-11-22 31 views
0

我有这个配置文件(在.CFG结尾的纯文本文件)如何读取和打印生成文件目标中的文件内容(某些设置)?

# The application name 
learningErlangTesting 

# The node name 
mysql_testing 

另外,我有这个Makefile:

ok: 
    APP=$(shell cat nodes.cfg | sed -n '2p') 
    NODE=$(shell cat nodes.cfg | sed -n '5p') 
    echo $(APP) 
    echo $(NODE) 

当我运行make好,我得到

APP=learningErlangTesting 
NODE=mysql_testing 
echo 

echo 

我的变量似乎是空的,我无法打印它们,也没有使用它们来建立一个文件夹路径(我打算这样做后,我会得到我的手)。

我在做什么错?

非常感谢, 德斯蒙德

回答

2

您的问题是一个makefile配方中的每行一个新的shell被调用。因此,第一行是在设置shell变量APP的shell中调用的。然后shell退出,失去了shell变量的设置。然后下一行运行在不同的外壳中,等等。

您必须将所有这些放在一个配方行中,以便它们都在同一个shell中运行。

另外,在你的echo命令中你正在打印make变量,但实际上你正在设置shell变量。

另外,在配方中使用make的shell函数几乎总是一个坏主意。在这种情况下,它不会受到伤害,但会导致很多混淆。

ok: 
     APP=$$(cat nodes.cfg | sed -n '2p'); \ 
     NODE=$$(cat nodes.cfg | sed -n '5p'); \ 
     echo $$APP; \ 
     echo $$NODE 

或者,如果配置文件是源文件(始终存在),您可以设置真正让变量,但你必须做一个配方之外:

APP := $(shell cat nodes.cfg | sed -n '2p') 
NODE := $(shell cat nodes.cfg | sed -n '5p') 

ok: 
     echo $(APP) 
     echo $(NODE) 
+0

取消+1,因为'cat ... | sed ...'是一个讽刺。修复OP的文体错误并忽略UUOC! – 2014-11-22 15:21:44

+0

我试过第二个版本,它的工作原理...你能解释一下:什么是$$(...)。我知道$(...)在子shell中执行某些内容,但不知道$$(...)。还需要在目标以外的make中声明变量吗?非常感谢,Desmond – adragomir 2014-11-22 19:41:26

+0

您需要阅读有关makefile语法。 Makefile不是shell脚本,makefile语法不是shell语法。 makefile中的'$(...)'并不是指在子外壳中执行的东西,它指的是一个变量引用。关于makefile的令人困惑的事情是,它们包含_contain_ shell脚本:规则的配方是shell脚本并使用shell语法。为了避免美元符号传递到shell而不是由make解释,你将它加倍,所以'$$'扩展为一个'$',它可以传递给shell。 http://www.gnu.org/software/make/manual/html_node/Introduction。html – MadScientist 2014-11-22 20:44:59

0

除了@MadScientist's answer您可以选择创建外壳脚本并从Makefile目标启动该脚本。这样一来,你也可以简化代码颇有几分:

$ cat Makefile 
ok: 
     $(shell ./ok.sh) 
$ cat ./ok.sh 
sed -n '2p' nodes.cfg 
sed -n '5p' nodes.cfg 

注意:你也可以简单地说./ok.shok目标,但随后你需要一个shebang line,我不知道的优雅的方式来确保生成的脚本使用相同的外壳作为Makefile

相关问题