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


    一:解释

    #!/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
    2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
    3. 也就是说 /bin/sh 相当于 /bin/bash --posix

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

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

    转自:https://www.cnblogs.com/jonnyan/p/8798364.html

  • 相关阅读:
    docker mysql8 phpmyadmin
    linux 压缩与解压缩
    Ubuntu添加开机自动启动程序的方法
    Linux基本命令集合
    linux下使用supervisor启动.net core mvc website的配置
    小修改,让mvc的验证锦上添点花(2)
    小修改,让mvc的验证锦上添点花(1)
    java 基础面试
    redis 面试题
    springMVC 面试题整理
  • 原文地址:https://www.cnblogs.com/sjxbg/p/10634871.html
Copyright © 2020-2023  润新知