几种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]# 

Logo

更多推荐