[shell]Linux脚本开头#!binbash和#!binsh是什么意思以及区别
⼀直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉⽤户这是⼀个shell脚本,⽽最近顺⼿查了下,才发现不是这个意思,分享下⾯的⽂章。
转⾃:
⼀、意思
#!/bin/sh是指此脚本使⽤/bin/sh来解释执⾏,#!是特殊的表⽰符,其后⾯跟的是此解释此脚本的shell的路径。
$ cat /etc/shells可以查看系统⽀持的shell格式
linuxecho是什么意思其实第⼀句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以⽤各种各样的解释器来写对应的脚本。
⽐如说/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系统之后的更改。以上参考: