• shell脚本头,#!/bin/sh与#!/bin/bash的区别.


    因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash.

    本文参考:https://www.cnblogs.com/aaronLinux/p/6885288.html和http://www.cnblogs.com/baizhantang/archive/2012/09/11/2680453.html

    一:解释

    #!/bin/sh是指此脚本使用 /bin/sh 来解释执行,#! 是特殊的表示符,其后面跟的是此解释此脚本的 shell 的路径。

    $ cat /etc/shells可以查看系统支持的shell格式

    其实第一句的 #! 是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。

    比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,/bin/python脚本,甚至/bin/echo等等。

    #!/bin/bash同理。

    二:区别

    脚本test.sh内容:

    #!/bin/sh 
    source pcy.sh #pcy.sh并不存在
    echo hello
    

    执行./test.sh,屏幕输出为:

    ./test.sh: line 2: pcy.sh: No such file or directory

    由此可见,在 #!/bin/sh 的情况下,source不成功,不会运行 source 后面的代码。

    修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:

    ./test.sh: line 2: pcy.sh: No such file or directory
    hello
    

    由此可见,在 #!/bin/bash 的情况下,虽然 source 不成功,但是还是运行了 source 后面的 echo 语句。
    但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:

    ./test.sh: line 2: pcy.sh: No such file or directory

    表示虽然脚本中指定了#!/bin/bash,但是如果使用 sh 方式运行,如果 source 不成功,也不会运行 source 后面的代码。

    为什么会有这样的区别呢?

    junru同学作了解释

    1. sh一般设成bash的软链
    [work@zjm-testing-app46 cy]$ ll /bin/sh
    lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
    
    1. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
    2. 也就是说 /bin/sh 相当于 /bin/bash --posix

    所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

    so,可以预想的是,如果第一行写成#!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

  • 相关阅读:
    八皇后-递归
    代码复用3
    权限管理系统-角色组模块
    MzBlog分析
    linux shell 终端中文乱码(转)
    LINUX下中文语言包的安装(转)
    每一个程序员必须知道的业内英语词汇(转)
    80后创业故事之:兄弟散伙,创业失败(转)
    尊重用户的习惯审美,不要挑战用户的习惯(转)
    libpcre.so.1 cannot be found
  • 原文地址:https://www.cnblogs.com/jonnyan/p/8798364.html
Copyright © 2020-2023  润新知