make忽略我的python bash别名

时间:2011-10-26 00:47:06

标签: makefile bash

我的CentOS 5.5服务器安装了Python 2.4和Python 2.7(到/opt/python2.7.2)。在我的~/.bash_profile中,我有两个别名指向我的Python 2.7安装,我的PATH配置为:

alias python=/opt/python2.7.2/bin/python
alias python2.7=/opt/python2.7.2/bin/python
PATH=$PATH:/opt/python2.7/bin

我也创建了一个符号链接:

ln -sf /opt/python2.7.2/bin/python /usr/bin/python2.7

我有一个Makefile,其中包含以下几行:

pythonbuild:
        python setup.py build

令我惊讶的是,我发现Python 2.4正在被调用而不是Python 2.7。

我必须明确指定python2.7

pythonbuild:
        python2.7 setup.py build

make是否忽略了bash别名?我猜make使用PATH来查找第一个python可执行文件(恰好是Python 2.4)?

3 个答案:

答案 0 :(得分:8)

来自bash(1)

   Aliases are not expanded when the shell is not interactive,
   unless the expand_aliases shell option is set using shopt
   (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

虽然您可以在SHELL=/bin/bash -O expand_aliases中使用Makefile这样的内容,但我认为明确依赖Makefile中较新的Python 很多比将依赖项隐藏在用户 ~/.bash_profile文件中更好。

相反,将PYTHON=/opt/python2.7/bin/python放入Makefile,然后您就可以使用:

pythonbuild:
    $(PYTHON) setup.py build

在你的规则中。

最好的部分是您可以轻松更改在命令行中使用的Python解释器:

make PYTHON=/tmp/python-beta/bin/python pythonbuild

如果您将其部署到其他网站,则Makefile中的一行行需要更新。

答案 1 :(得分:1)

别名通常仅由交互式shell使用

请注意,我认为make并不总是调用shell 你最好的选择是明确你想要使用的路径

答案 2 :(得分:1)

使用grep和awk解决方法:

这个解决方案的优点是,如果我更改〜/ .bash_profil或〜/ .bashrc中的别名,我的makefile也会自动采用它。

说明

我想在我的makefile中使用别名lcw ,它在我的〜/ .bashrc文件中定义。

<强>的.bashrc

...
alias lcw='/mnt/disk7/LCW/productiveVersion/lcw.out'
...

我还使用了其他解决方案中提供的varialble的定义,但是我使用grep和awk直接从bashrc中读取它的值。

<强>生成文件

LCW= $(shell grep alias\ lcw= ~/.bashrc | awk -F"'" '{print $$2}')

.PHONY: std
std:
    $(LCW)

如您所见,命令$(LCW)从makefile调用lcw别名。

注意:

我的解决方案假设bashrc中的别名是在''characters。

中定义的