makefile中使用echo -e引发的思考(涉及dash和bash)
2013-10-08 00:54
295 查看
背景
有次我在写makfile时,用echo -e要显示带颜色的文字,命令如下:echo -e "Full Version is:\033[31m\033[1m v1.0 \033[0m"; |
Full Version is: v1.0 |
-e Full Version is: v1.0 |
原因
该问题折腾我许久,百思不解,寻谷歌,问度娘,终于明白其中缘由。这是由于不同的shell(一个是bash,一个是dash)造成的两种不同的结果,即在bash下正常,在dash下就多显示了一个-e。从Ubuntu 6.10开始,默认使用的shell是dash,而不是bash,原因是dash更快、更高效,使用dash可以加快启动速度。
我们可以做如下实验来验证下,先启用bash运行下指令,在启用dash试试:
# # /bin/bash # echo -e "Full Version is:\033[31m\033[1m v1.0 \033[0m"; Full Version is: v1.0 # exit exit # # /bin/dash # echo -e "Full Version is:\033[31m\033[1m v1.0 \033[0m"; -e Full Version is: v1.0 # exit # |
makefile用的是哪个shell
makefile用的shell默认是/bin/sh。但/bin/sh紧紧是个链接文件,到底用的是什么shell程序可以通过ls查看:# ls -ls /bin/sh 0 lrwxrwxrwx 1 root root 4 6月 20 2012 /bin/sh -> dash |
# echo $SHELL /bin/bash # echo $0 -bash |
那makefile能不能显示的指定哪个shell程序来运行命令呢?答案肯定的。makefile本身有个环境变量也叫SHELL(跟系统环境变量SHELL同名,但不一样),我们可以在makefile中明确的给他赋值,以指明用哪个shell程序来解析命令。如SHELL = /bin/bash。
我在makefile最前面加上SHELL = /bin/bash,问题就解决了。
相关文章推荐
- jdbc查询引发一个思考(使用反射)
- 高并发读写压力如何处理?redis内存数据库使用场景引发的思考
- 使用单元测试引发的一些思考
- makefile中使用echo向文件中输出版本号和编译时间
- 由getchar()函数的使用而引发的思考.
- UpdateData引发的API使用的思考
- 一次关于使用status作为变量引发的bug及思考
- 对于很多公司不使用STL 引发的思考
- 学习makefile引发的思考
- 由使用多态引发的一些思考
- 由注册用户名不能使用单引号和双引号引发的思考
- 由“使用存储过程”引发的一些思考(高手请进)
- 使用外连接引发的一点思考
- Linux基础命令之echo(涉及bash命令引用及替换部分内容)
- 由@Async使用引发的思考,实现优雅关闭线程
- 使用echo $PATH来解决bash: command not found
- 由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考
- Linux下Bash的变量使用,echo,read,declare,typeset,array,
- 由使用Scanf()函数导致程序逻辑错误引发的思考
- 性能测试java协议使用httpclient方法引发的思考