Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何阅读&;打印makefile目标内的文件内容(某些设置)?_Linux_Bash_Makefile - Fatal编程技术网

Linux 如何阅读&;打印makefile目标内的文件内容(某些设置)?

Linux 如何阅读&;打印makefile目标内的文件内容(某些设置)?,linux,bash,makefile,Linux,Bash,Makefile,我有这个配置文件(一个以.cfg结尾的纯文本文件) 此外,我还有一个Makefile: ok: APP=$(shell cat nodes.cfg | sed -n '2p') NODE=$(shell cat nodes.cfg | sed -n '5p') echo $(APP) echo $(NODE) 当我跑的时候,让我好起来 APP=learningErlangTesting NODE=mysql_testing echo echo 我的变量似

我有这个配置文件(一个以.cfg结尾的纯文本文件)

此外,我还有一个Makefile:

ok:
    APP=$(shell cat nodes.cfg | sed -n '2p')
    NODE=$(shell cat nodes.cfg | sed -n '5p')
    echo $(APP)
    echo $(NODE)
当我跑的时候,让我好起来

APP=learningErlangTesting
NODE=mysql_testing
echo 

echo 
我的变量似乎是空的,我不能打印它们,也不能使用它们来构建文件夹路径(在我得到它们之后,我打算这样做)

我做错了什么

非常感谢,,
Desmond

您的问题是makefile配方的每一行都在一个新的shell中被调用。因此,在shell中调用第一行,其中设置了shell变量
APP
。然后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
或者,如果配置文件是源文件(始终存在),则可以设置real make变量,但必须在配方之外进行:

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

ok:
        echo $(APP)
        echo $(NODE)
除此之外,您还可以选择创建一个shell脚本,并从
Makefile
目标启动该脚本。这样,您还可以大大简化代码:

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

注意:您也可以简单地将
/ok.sh
放在
ok
目标中,但是您需要一个,我不知道有什么优雅的方法可以确保生成的脚本使用与
Makefile

撤销a+1相同的shell,因为
cat…|sed…
是一种讽刺。修正OP的风格错误并省略UOOC!我尝试了第二个版本,它的作品。。。请你解释一下:$$(…)是什么。我知道$(…)在子shell中执行某些操作,但不知道$$(…)。还需要在make中声明目标之外的变量吗?非常感谢,Desmondy您需要了解makefile语法。Makefiles不是shell脚本,makefile语法也不是shell语法$(…)并不是指在子shell中执行操作,而是指变量引用。makefiles令人困惑的是,它们包含shell脚本:规则的配方是shell脚本,并且使用shell语法。要对美元符号进行转义,以便将其传递到shell而不是由make进行解释,您可以将其加倍,从而将
$$
扩展为一个可以传递到shell的
$
@疯狂科学家:非常感谢您的帮助,祝您愉快:)
$ cat Makefile
ok:
        $(shell ./ok.sh)
$ cat ./ok.sh
sed -n '2p' nodes.cfg
sed -n '5p' nodes.cfg