相关文章推荐
善良的芹菜  ·  如何从Google ...·  6 月前    · 
温文尔雅的砖头  ·  laravel-admin ...·  1 年前    · 
欢快的冰淇淋  ·  vs2013 ...·  1 年前    · 
活泼的手术刀  ·  Cannot connect to ...·  1 年前    · 

一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章。

转自: http://www.cnblogs.com/EasonJim/p/6850319.html

#!/bin/sh 是指此脚本使用 /bin/sh 来解释执行, #! 是特殊的表示符 其后面跟的是此解释此脚本的shell的路径

$ cat /etc/shells可以查看系统支持的shell格式

其实第一句的 #! 是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。

比如说 /bin/csh 脚本, /bin/perl 脚本, /bin/awk 脚本, /bin/sed 脚本,甚至 /bin/echo 等等。

#!/bin/bash 同理。

GNU/Linux操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从NetBSD移植到Linux并更名为 dash (Debian Almquist Shell) ,并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。

所以也就是在Ubuntu中可以认为 /bin/sh就是/bin/dash , 如果打算使用bash, 可直接将/bin/sh 软链接 到/bin/bash.

Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。

应该说, /bin/sh /bin/bash 虽然大体上没什么区别,但仍存在不同的标准。标记为 #!/bin/sh 的脚本不应使用任何 POSIX 没有规定的特性 (如 let 等命令, 但 #!/bin/bash 可以)。Debian曾经采用 /bin/bash 更改 /bin/dash ,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在 bash shell 下可以运行的shell script (shell 脚本),在 /bin/sh 下还是会出现一些意想不到的问题,不是100%的兼用。

上面可以这样理解,使用 man sh 命令和 man bash 命令去观察,可以发现 sh 本身就是 dash ,也就更好的说明集成Debian系统之后的更改。

以上参考: http://blog.chinaunix.net/uid-27037833-id-3431985.html