【Linux】/bin/bash和/bin/sh的区别
几种shellLinux中的shell有多种类型;其中最常用的几种是Bourne shell (sh)、C shell (csh) 和Korn shell (ksh),三者各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourneshell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Li...
几种shell
Linux中的shell有多种类型;
其中最常用的几种是Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh),三者各有优缺点。
- Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
- Linux操作系统缺省的shell是Bourne Again shell (Bash),它是Bourne shell的扩展,与Bourne shell完全向后兼容,并且在其基础上增加、增强了很多特性。Bash放在/bin/bash中,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
- GNU/Linux 操作系统中的 /bin/sh 是 bash (Bourne Again Shell)的符号链接,但鉴于 bash 过于复杂,有人把ash 从 NetBSD 移植到 Linux 并更名为 dash(Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。
/bin/sh与/bin/bash的区别
shell脚本的开头往往有一行来定义使用哪种sh解释器来解释脚本:
#!/bin/sh
#!/bin/bash
脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
执行./test.sh,屏幕输出如下,由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
./test.sh: line 2: pcy.sh: No such file or directory
修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出如下。由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
./test.sh: line 2: pcy.sh: No such file or directory
hello
试着运行sh ./test.sh,这次屏幕输出如下,表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。
./test.sh: line 2: pcy.sh: No such file or directory
为什么会有这样的区别呢?
- 1、sh一般设成bash的软链
- [work@zjm-testing-app46 cy]$ ll /bin/sh
- lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
- 2、在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
- 3、也就是说 /bin/sh 相当于 /bin/bash --posix
所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别。可以预想的是,如果第一行写成 #!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)
例如:
[root@localhost yuhj]# head -n1 x.sh
#!/bin/sh
[root@localhost yuhj]# ./x.sh
./x.sh: line 8: syntax error near unexpected token `<'
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)'
[root@localhost yuhj]#
[root@localhost yuhj]# head -n1 x.sh
#!/bin/bash
[root@localhost yuhj]# ./x.sh
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.202.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.202.2 0.0.0.0 UG 0 0 0 eth0
Number of lines read = 4
[root@localhost yuhj]#
[root@localhost yuhj]# head -n1 x.sh
#!/bin/bash --posix
[root@localhost yuhj]# ./x.sh
./x.sh: line 8: syntax error near unexpected token `<'
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)'
[root@localhost yuhj]#
[root@localhost yuhj]# ll /bin/sh /bin/bash
-rwxr-xr-x 1 root root 735004 May 25 2008 /bin/bash
lrwxrwxrwx 1 root root 4 Jan 29 00:39 /bin/sh -> bash
[root@localhost yuhj]#
更多推荐
所有评论(0)