设为首页 收藏本站
查看: 992|回复: 0

Bash shell中bash、sh、source及“.”点的区别与联系

[复制链接]

尚未签到

发表于 2018-8-22 09:59:32 | 显示全部楼层 |阅读模式
  在众多Linux发行版中bash shell 可谓是随处可见。作为众多发行版的首选shell,对于bash shell的学习对我们来说,显得格外重要。在学习bash shell的过程中,bash、sh、source及英文输入状态下的点号经常交替出现,他们看起来作用都差不多,但是深究下去,他们也有着不小的区别与联系。下面就让我们以具体实验来看一下它们之间的区别与联系吧!
  一、查看当前系统支持的shell类型
  

[root@Geeklp-BashShell ~]# cat /etc/shells  
/bin/sh
  
/bin/bash
  
/sbin/nologin
  
/usr/bin/sh
  
/usr/bin/bash
  
/usr/sbin/nologin
  

  以上列出了当前系统所支持的shell类型。查看shell的历史我们可以知道,我们通常所说的bash shell(bash)全称为GNU Bourne-Again SHell。在目前的发行版中,sh已经成为bash的一个软连接。在man sh的时候大家都会发现,其实man出来的手册时bash的内容。
  

[root@Geeklp-BashShell ~]# ll /bin/sh  
lrwxrwxrwx. 1 root root 4 11月 20 10:05 /bin/sh -> bash
  
[root@Geeklp-BashShell ~]# ll /bin/bash
  
-rwxr-xr-x. 1 root root 960472 8月   3 05:11 /bin/bash
  

  二、建立实验脚本
  a.sh的内容如下:
  

#!/bin/bash -  
#===============================================================================
  
#          FILE: a.sh
  
#         USAGE: ./a.sh
  
#        AUTHOR: Geeklp (IVAN DU), geeklp@qq.com
  
#  ORGANIZATION: GEEKLP
  
#       CREATED: 2018年01月19日 17时26分45秒
  
#      REVISION:  ---
  
#===============================================================================
  

  
set -o nounset
  
myName=`whoami`                              # Treat unset variables as an error
  
age=28
  
echo "My name is $myName .I am $age this year."
  

  b.sh的内容如下:
  

#!/bin/bash -  
#===============================================================================
  
#          FILE: b.sh
  
#         USAGE: ./b.sh
  
#        AUTHOR: Geeklp (IVAN DU), geeklp@qq.com
  
#  ORGANIZATION: GEEKLP
  
#       CREATED: 2018年01月19日 17时31分37秒
  
#      REVISION:  ---
  
#===============================================================================
  
set -o nounset                              # Treat unset variables as an error
  
echo "My name is $myName . I am $age this year."
  

  三、具体探讨这几种执行方式的区别与联系


  •   bash、sh执行a.sh和b.sh
      

    [Geeklp@Geeklp-BashShell ~]$ bash a.sh  
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ bash b.sh
      
    b.sh:行11: myName: 为绑定变量
      
    [Geeklp@Geeklp-BashShell ~]$ sh a.sh
      
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ sh b.sh
      
    b.sh:行11: myName: 为绑定变量
      

      可以看出来,bash及sh执行的脚本效果是一致的。

  • source及"."分别执行a.sh、b.sh。  

    [Geeklp@Geeklp-BashShell ~]$ source a.sh  
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ source b.sh
      
    My name is Geeklp . I am 28 this year.
      

    [Geeklp@Geeklp-BashShell ~]$ . ~/a.sh  
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ . ~/b.sh
      
    My name is Geeklp . I am 28 this year.
      

      从上面的2个代码块中,我们可以看出,b.sh脚本直接引用了a.sh中的变了,如果我们依次执行几个有关联的脚本就可以采用这种方式,否则则使用bash及sh比较恰当。
      注意:代码块2中的点与脚本路径中间有至少一个空格。
      接下来,我们继续以点“.”来运行a.sh及b.sh。
      

    [Geeklp@Geeklp-BashShell ~]$ ./a.sh  
    bash: ./a.sh: 权限不够
      

      这个点与执行脚本之间无空格,表示执行当前目录下的a.sh脚本,相当于~/a.sh。b.sh也是一样的结果,无需讨论。
      

    [Geeklp@Geeklp-BashShell ~]$ chmod u+x [ab].sh  
    [Geeklp@Geeklp-BashShell ~]$ ./a.sh
      
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ ./b.sh
      
    ./b.sh:行11: myName: 为绑定变量
      
    [Geeklp@Geeklp-BashShell ~]$ ~/a.sh
      
    My name is Geeklp .I am 28 this year.
      
    [Geeklp@Geeklp-BashShell ~]$ ~/b.sh
      
    /BashShell/b.sh:行11: myName: 为绑定变量
      

      从以上代码块中不难看出:通过"."(无空格)来执行脚本时需要给需要执行的脚本加上执行权限,否则无法执行。加了权限之后,执行效果与bash及sh一致,不继承变量。
      四、结论

    • bash与sh在对于脚本执行来说,效果一致,不继承除了当前shell之外的变量值。在无空格“.”且有执行权限的脚本执行中,效果与bash及sh一致。
    • source及带空格的“.”执行效果一致,且会继承其他shell的变量。
    • 除了不带空格的“.”之外,其他脚本的执行都不需要给脚本增加执行权限。  五、一个小疑问
        请大家看一下以下命令的效果:
        

      [root@Geeklp-BashShell ~]# bash  
      [root@Geeklp-BashShell ~]# sh
        
      sh-4.2# exit
        
      exit
        
      [root@Geeklp-BashShell ~]# bash --posix
        
      bash-4.2#
        

        在上文中,我们能够看到sh是bash的一个软连接,但是单独输入bash和sh命令时,所呈现的效果却不一致?这里目前我并不是很清楚,麻烦有知道的小伙伴告知一下这是为什么?非常感谢!





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554979-1-1.html 上篇帖子: 每日一shell(一)磁盘日志 下篇帖子: 每日一shell(二)日志IP统计排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表