日期:2014-05-16  浏览次数:20692 次

Linux下shell与子shell及执行Script的几种方式
    Linux登陆主机后,在执行Script之前,其实我们已经处于一个shell中,即Login shell。它是将来要执行Script的父shell。如root账号默认为/bin/bash。
     Linux下每个账号都可以自定义Login shell,在/etc/passwd文件中。Login shell定义在第七个字段,如果这个字段的shell程序不存在、不合法,或执行失败,则无法登陆主机。
     当在执行一个Shell Script时,父shell会根据Script程序的第一行#!之后指定的shell程序开启一个子shell环境,然后在子shell中执行此Shell Script,一旦执行完毕,子shell结束,回到父shell,不会影响原父shell的环境。

Linux执行Script有三种执行方式:
1.source filename 或者 . filename
  注意. Filename中,. 和filename之间有个空格。
  此命令式在当前shell环境下读取并执行filename中的命令。该filename文件可以无执行权限。通常用于重新执行刚修改的初始化文档。source命令(从 C Shell 而来)是bash shell的内置命令。 点命令,就是个点符号,(从Bourne Shell而来),就是顺序的执行文件里的命令而已。
2.sh filename 或者 bash filename
  此命令是在当前相应的bash环境下新建一个子shell读取并执行FileName中的命令,该filename文件可以无执行权限。
3.  ./filename
  此命令打开一个子shell来读取并执行filename中命令,该文件必须必须有可执行的权限。chmod +x filename。
三者的区别:
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
举例:
1.新建一个test.sh脚本,内容为:A=1。
2.然后使其可执行chmod +x test.sh。
3.运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell。
4.运行./test.sh后,也是一样的效果。
5.运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell 中。
举例:
1.新建一个sh01.sh脚本,内容为
#!/bin/bash
echo $SHLVL  (输出当前shell的层次)
2.然后使其可执行chmod +x sh01.sh。
3.运行sh sh01.sh后,输出3。
4.运行./ sh01.sh后,也是一样的效果。
5.运行source sh01.sh 或者 . sh01.sh,输出2。
举例:
1.登录主机后,打开一个终端,输入echo $SHLVL,输出2。
2.输入bash,进入一个子shell,然后再输入echo $SHLVL,输出3。
3.输入exit,然后再输入echo $SHLVL,输出2。
4.输入exit,退出终端。

1 楼 cometzb_xujun 2012-06-15  
很好,期待更加优秀的博客