我的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)?
答案 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。
中定义的