makefile 中制定shell

来源:互联网 发布:缺少网络协议 编辑:程序博客网 时间:2024/04/27 13:43
或者在make后面加 SHELL=/bin/bash解决
make SHELL=/bin/bash

很早以前,初次学习Linux,最先了解的就是那几种shell,但是的感觉就是没感觉,只是把shell看成是如DOS类的语言嘛,最终目的还是要在shell下运行chmod a+x的可执行程序,所以无所谓哪种shell,从来也没把这当回事。做Linux开发的嘛,不会写Makefile,也会读Makefile嘛,看的多了,就感觉Makefile很大部分工作都是通过执行shell脚本来实现的,任何Makefile拿过来,都是直接在shell下用.config 之后直接make,一直也没出过问题。所以就渐渐淡忘了shell与Makefile间的关系了。

 

今天在编译一个第三方库的时候,按照编译手册,设置完环境变量后,就应该直接make,操作步骤跟原来遇到的一样,没有什么异常,但是却出现了错误,说/bin/sh source not found,这就奇怪了,我在shell下直接source是好用的啊,当时以为Makefile里面的环境变量有问题,就想找到source的绝对路径,直接替换,于是通过"whereis source"查找source命令的路径,却没有找到。很是奇怪,以为是PATH路径里面没包含,但是在shell下打souce确实可以运行啊。百思不得其解。于是就开始了网上查找相关资料,发现网上都是介绍source的使用方法的,里面么有一个提source的路径的问题的。倒是有人说用.替换source的,实在没办法,用CTRL_H把source 替换成了“。”,这部分通过了,可又出现了pushd,popd的同样的问题,这就很奇怪了,我在shell下都是可用的,可在Makefile里面就是不行,还有就是同样的在PATH路径下面都没有这几个命令。只能求助网络,查了很多很多,总算在无意当中顿悟了,这个问题居然出在shell上。sourc/pushd/popd 都是属于shell的内置命令,在PATH里当然找不到了。而只能在shell里面运行。但是这几个命令只在bash  shell里面。我们在adduser时是可以选择登陆shell种类的,/bin/sh /bin/bash等等。我的Linux默认登陆的就是/bin/bash,但是Makefile里面如果不指定,那默认就是/bin/sh,所以会出现上面这个很诡异的问题。在Makefile中使用SHELL=/bin/bash来指定在Makefile中所使用的shell种类,这个问题就解决了。这里多说几句就是我们经常在写脚本时,习惯性的第一句都写的是#! /bin/sh或者 #! /bin/bash原来一直以为这个就是个注释,根本没在意,原来这里就是指定的shell解释器种类,一般来讲/bin/sh与/bin/bash都是通用的,二者的命令基本一致。但是涉及到内部命令或者一些命令的细节的时候二者就有区别了,而这种错误又是不容易想到的,以后再遇到类似问题的时候一定要考虑一下有没有可能是shell种类的问题。

0 0
原创粉丝点击