2017-08-11 44 views
0

是否可以告诉SHELL,例如bash,使用特定的(bash)rc文件使用.SHELLFLAGS我可以使用.SHELLFLAGS变量在GNU-Make中选择“bashrc”文件吗?

下面你会看到两个例子。第一个显示了我想要做的事,第二个显示了达到预期结果的一种方式。

我问的原因是我有一个bashrc文件(来自OpenFOAM),它定义了一些我想在各种配方中使用的变量和函数。

谢谢你的时间。


示例(不工作

  • 文件:bashrc

    export HELLOWORLD="Hello World" 
    
  • 文件:Makefile

    SHELL=/bin/bash 
    .SHELLFLAGS=--rcfile bashrc -- 
    
    test: 
        @\ 
        echo "$${HELLOWORLD}" 
    

示例(工作

  • 文件:bashrc

    export HELLOWORLD="Hello World" 
    
  • 文件:Makefile

    .ONESHELL: 
    SHELL=/bin/bash 
    
    test: ; source bashrc 
        @\ 
        echo "$${HELLOWORLD}" 
    

回答

2

如果你读有关--rcfile选项bash的man页面,你会发现:

--rcfile file 
      Execute commands from file instead of the system wide initial‐ 
      ization file /etc/bash.bashrc and the standard personal initial‐ 
      ization file ~/.bashrc if the shell is interactive (see INVOCA‐ 
      TION below). 

尤其值得注意的外壳必须是互动式的,这有什么影响,而是一个壳,使所调用,当然不是互动。其次,如果您阅读了.SHELLFLAGS上的GNU make手册,您会看到缺省值为-c(或POSIX模式下的-ec); -c选项允许shell读取脚本以从命令行运行,这是make如何调用shell。这意味着当您用自己的价值取代.SHELLFLAGS时,您必须包含这一点。

因此,与你的makefile时make运行时,它会使用这个命令行外壳:

/bin/bash --rcfile bashrc -- 'echo "${HELLOWORLD}"' 

这显然是行不通的。您需要设置.SHELLFLAGS这样的:

.SHELLFLAGS = --rcfile bashrc -ic -- 

-i选项将强制执行交互shell,你需要的-c选项告诉make运行的第一个非选项的参数为命令。

相关问题