Ale*_*xTP 4 bash shell makefile eval
我正在学习makefile.我在理解makefile中使用eval时遇到问题.
这是我的Makefile:
testt:
@R=5
$(eval $(echo $R))
Run Code Online (Sandbox Code Playgroud)
当我运行make testt时,没有显示任何内容.你能告诉我是什么原因吗?非常感谢.
我不知道stackoverflow是您在这里寻找的信息级别的最佳位置.最好回答具体问题,但基于这个例子,你需要先得到一些更基本的理解.
仅供参考,测试的第一行是设置shell变量R.然后该行结束,从该shell调用退出,现在您的变量设置将丢失.然后在下一行中通过引用访问make变量.那从未在任何地方设置,所以总是一个空字符串.然后你尝试将它赋予make函数,但make 中没有这样的函数,所以也扩展为空字符串.然后将生成的空字符串传递给函数,并且计算空字符串会产生另一个空字符串,然后将其作为要运行的命令提供给shell,该字符串不执行任何操作.R$R$(echo ...)$(eval ...)
如果你想问一个特定的问题("我该怎么做XYZ?"),那么我们可以给出答案......但是需要GNU制作手册的重要部分来帮助这个级别.您也可以在help-make@gnu.org邮件列表上询问.
当make在makefile中读取时,它将shell命令块testt作为单个递归扩展变量存储.没有发生任何不幸事件.
读完你的makefile后,make现在决定要构建什么.testt是第一个目标,所以它有一个去.您testt的文件系统中没有调用文件,因此make决定必须运行shell命令块.
此时它会尝试扩展之前变得松散的变量.它开始于
@R=5
$(eval $(echo $R))
Run Code Online (Sandbox Code Playgroud)
首先是扩展$R.扩张是空的,留下制造
@R=5
$(eval $(echo ))
Run Code Online (Sandbox Code Playgroud)
现在,它扩大了$(echo ).这个变量也不存在,而make也是如此
@R=5
$(eval )
Run Code Online (Sandbox Code Playgroud)
Make确实知道$(eval ...),但它的输出总是空的.所以现在做了
@R=5
Run Code Online (Sandbox Code Playgroud)
扩展完成后,make现在分别按顺序传递每一行到shell的新调用,检查每个的返回码.所以,shell看到了R=5.此命令(对shell变量的简单赋值)完成且没有错误.由于@前缀,Make不会将此回显到stdout .全部完成.
总是运行make with --warn-undefined-variables.
$ make --warn-undefined-variables
Makefile:3: warning: undefined variable `R'
Makefile:3: warning: undefined variable `echo '
make: Nothing to be done for `testt'.
Run Code Online (Sandbox Code Playgroud)
(请注意变量名末尾的额外空格:( `echo '是的,您可以使用包含空格的变量名称).)
哦,虽然我在它,$(eval ...)真的很有用,但不要在shell命令中使用它.它很少有意义.