zoukankan      html  css  js  c++  java
  • 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的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

  • 相关阅读:
    1、向服务传送复杂的类型实例(服务端程序)(摘自ProAndroid2)
    我项目中用到的jquery+json+struts2
    JSON与JAVA的数据转换
    管理和组织首选项
    python中如何对dict对象进行排序
    python cx_Oracle模块的安装和使用(linux环境)
    python cx_Oracle模块的安装和使用(linux环境)
    django的一个小功能——SortedDict
    Linux中source命令的用法
    linux uname命令参数及用法详解linux查看系统信息命令
  • 原文地址:https://www.cnblogs.com/jonnyan/p/8798364.html
Copyright © 2011-2022 走看看