转 关于shell脚本中#!/bin/bash and #!/bin/ksh 的说明

 

 


1.在文件里面输入一系列命令,能够直接执行吗?
能够。做者认为,这时调用的是当前用户默认使用的shell。
若是其中一个命令有错,后面的命令仍是会继续执行下去的
若是说使用了”&&” ,若是前面的命令执行错误,,后面的命令不执行。 html

2.加#/bin/bash目的是什么,既然不加也能够?
这些不是注释符,而是说明下面的脚本是在什么shell下面运行的,而且以该shell环境来执行脚本。Linux中的shell有多种类型,其中最经常使用的几种是Bourne   shell(sh)、C   shell(csh)和Korn   shell(ksh)。三种shell各有优缺点。Bourne   shell是UNIX最初使用的shell,而且在每种UNIX上均可以使用。Bourne   shell在shell编程方面至关优秀,但在处理与用户的交互方面作得不如其余几种shell。Linux操做系统缺省的shell是Bourne   Again   shell,它是Bourne   shell的扩展,简称Bash,与Bourne   shell彻底向后兼容,而且在Bourne   shell的基础上增长、加强了不少特性。 shell

一个简单的例子 编程

#!/bin/ksh           必定放在第一行
export LOG=/tmp/test.log
exec >> $LOG 2>&1
echo "a test message!"
exit 0 bash

在AIX下面编辑好该脚本后直接执行,运行成功在/tmp下面会有一个test.log文件生成,文件内容为"a test message!" 操作系统

若是咱们把上面的
#!/bin/ksh
换成
#!/bin/csh
执行脚本,则会有以下报错:
export不是shell命令
即,在csh里面没有export这个命令,因此会报错。 server

 

http://www.server110.com/shell/201404/10508.htmlhtm

 

 

3.ip

 

关于#!/bin/bash和#!/bin/sh
 
#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有不少其它shell,如:sh,csh,ksh,tcsh,...
咱们能够经过如下一个示例来进行实验,了解#!/bin/bash的使用。
除第一行外,脚本中全部以“#”开头的行都是注释。
1)#!/bin/bash只能放在第一行,若是后面还有#!,那么只能当作是注释。
这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来得到可执行权限):
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
 
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
 
tbash3.sh:
source abc
echo "hello abc"
 
三个脚本执行的结果:
[ns vc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh再也不往下面执行。
[nsvc@localhost other]$ ./tbash2.sh 
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:当source命令执行有问题时,bash继续执行下面命令。
[nsvc@localhost other]$ ./tbash3.sh 
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登陆 系统所在的shell是bash。因此,当source命令执行有问题时,bash继续执行下面命令。
 
若是将tbash1.sh改为:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
那么,执行结果是:
[nsvc@localhost other]$ ./tbash1.sh 
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。
 
当把tbash1.sh改为:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并无往下执行。说明,#!/bin/sh这一行起到做用了,但#!/bin/bash并无起做用。在脚本中,除第一行外,脚本中全部以“#”开头的行都是注释。
 
2)#!后面的路径必定要正确,不正确会报错。
假如,咱们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:
#!/home/sh
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh 
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory
系统会提示/home/sh的路径不存在。
 
3)若是一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登陆的shell,为脚本解释器。
在1)中,脚本tbash3.sh的执行结果,就是用当前本身登陆的shell(bash)解释后的结果。咱们一般所用的shell都是bash,若是哪天登陆到sh,再使用以上类型的脚本,就会有问题。如下是本身登陆到sh下,执行tbash3.sh的结果:
-sh-3.2$ ./tbash3.sh 
./tbash3.sh: line 1: abc: 没有那个文件或目录
与1)中的执行结果是不同的。
所以,你们应该养成脚本首行加上#!+shell路径的习惯。
 
4)/bin/sh至关于/bin/bash --posix
咱们将脚本tbash1.sh改成:
#!/bin/bash --posix
source abc
echo "hello abc"
执行结果:
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果同样。
 
咱们还能够以tbash3.sh为示例。
用如下命令来执行该脚本:
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh 
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh 
tbash3.sh: line 1: abc: No such file or directory
 "bash tbash3.sh"表示使用bash来做为脚本解释器来执行tbash3.sh。一样,也可使用如”sh脚本名“这样的命令,来用sh做为脚本解释器。
从结果能够看出,/bin/bash--posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,其实是bash有没开启posix模式的区别。遵照posix规范,可能包括,”当某行代码出错时,不继续往下执行。“
 
最后加上一点说明,每一个脚本开头都使用"#!",#!其实是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种状况下,指的就是一 个可执行的脚本。在#!以后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序能够是shell,程序语言或者任意一个通用程序。
相关文章
相关标签/搜索