美文网首页
linux之shell、bash、source和sh的区别

linux之shell、bash、source和sh的区别

作者: oceanfly | 来源:发表于2022-07-26 17:11 被阅读0次

    shell

    首先说下shell shell其实是和kernel相对的概念
    在linux中 kernel属于系统内核 内核封装了对硬件的操作
    而shell就是外壳 顾名思义 外壳封装了对内核的操作
    shell可以直接执行命令 也可以执行脚本文件(shell脚本)
    而linux中常见的shell程序就是 bash和sh

    bash

    linux默认的shell程序就是bash 位于/bin/bash下

    # 环境变量SHELL保存了当前默认的shell程序的路径
    [root@centos76 ~]# echo $SHELL
    /bin/bash
    

    命令行光标之前的部分[root@centos76 ~]#是命令行提示符

    # []是普通字符
    # 其中root是用户名 可以通过whoami查看
    [root@centos76 ~]# whoami
    root
    # @是普通字符
    # 其中centos76 是主机名 可以通过hostname查看
    [root@centos76 ~]# hostname
    centos76
    # 然后是一个空格
    # 接着是当前路径 可以通过pwd查看 路径是个简写只有最后一层 在家目录的话显示~
    [root@centos76 ~]# cd /etc/sysconfig/
    [root@centos76 sysconfig]# pwd
    /etc/sysconfig
    # 最后是个命令提示符 root用户显示# 普通用户显示$
    

    命令提示符的格式是通过环境变量PS1来控制的

    # \u表示用户名 \h表示主机名 \W表示简短路径 \$表示提示符 root用户显示# 普通用户显示$
    [root@centos76 sysconfig]# echo $PS1
    [\u@\h\ \W\]\$
    

    所以如果想改变格式颜色等可以通过修改PS1环境变量来实现

    vim /root/.bashrc
    添加一行并保存
    PS1='[\[\e[35;1m\]\u@\[\e[33;1m\]\h\[\e[34;1m\] \W\[\e[0m\]]\$ '
    source /root/.bashrc
    
    image.png

    sh

    sh是另外一个shell程序 功能和bash一样 既可以执行命令 也可以执行shell脚本

    [root@centos76 ~]# sh
    sh-4.2# pwd
    /root
    sh-4.2# ls
    anaconda-ks.cfg  data  find  sjk
    sh-4.2# 
    

    bash和sh的区别

    bash和sh的区别主要体现在执行shell脚本的时候
    我们先写一个shell脚本test.sh 内容如下

    [root@centos76 data]# vim test.sh
    [root@centos76 data]# 
    [root@centos76 data]# cat test.sh
    source err
    echo hello
    

    这个脚本中有两个命令 其中第一个命令会因为err找不到而报错
    我们分别用 sh和bash执行以下看看效果

    [root@centos76 data]# sh test.sh 
    test.sh: 第 1 行:source: err: 没有找到文件
    [root@centos76 data]# bash test.sh 
    test.sh:行1: err: 没有那个文件或目录
    hello
    

    发现sh在执行脚本的时候遇到错误就不继续执行下去了 所以hello没有打印
    而bash在执行脚本的时候遇到错误会继续执行下去 所以hello打印出来了

    我们给test.sh赋予执行权限后 就可以直接执行脚本文件 而不用显式调用sh或者bash

    [root@centos76 data]# chmod 755 test.sh 
    [root@centos76 data]# ll
    总用量 8
    -rw-r--r--. 1 root root 19 2022-07-26 15:32:39 a.sh
    -rwxr-xr-x. 1 root root 22 2022-07-26 16:47:24 test.sh
    ot@centos76 data]# ./test.sh 
    ./test.sh:行1: err: 没有那个文件或目录
    hello
    

    会发现这么执行的话 是调用了默认的bash执行的 因为hello打印出来了
    你也可以在shell脚本的开头指定默认shell程序

    [root@centos76 data]# vim test.sh 
    [root@centos76 data]# 
    [root@centos76 data]# cat test.sh 
    #!/bin/sh
    source err
    echo hello
    [root@centos76 data]# ./test.sh 
    ./test.sh: 第 2 行:source: err: 没有找到文件
    [root@centos76 data]#
    

    这样再默认执行test.sh的时候就是调用 sh而不是bash了
    注意:如果调用的时候指定了bash 就不会考虑#!/bin/sh

    # 此时又显示指定了用 bash来执行 所以会忽略 test.sh文件开头的#!/bin/sh
    [root@centos76 data]# bash test.sh 
    test.sh:行2: err: 没有那个文件或目录
    hello
    

    总结:sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。

    POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。POSIX标准意在期望获得源代码级别的软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统上编译执行。

    扩展

    其实source命令也可以执行 shell脚本

    [root@centos76 data]# source test.sh 
    -bash: err: 没有那个文件或目录
    hello
    

    发现遇到错误后和bash一样不会停下来
    那么source和bash又有什么区别呢
    source会在当前bash下执行 而bash或者sh会新开一个子bash或者子sh执行

    # 在test.sh中定义一个变量a=1
    [root@centos76 data]# vim test.sh
    [root@centos76 data]# cat test.sh 
    #!/bin/sh
    a=1
    source err
    echo hello
    

    用 bash执行

    [root@centos76 data]# bash test.sh 
    test.sh:行3: err: 没有那个文件或目录
    hello
    # 变量a访问不了 因为test.sh是在子bash中执行 当前bash访问不了
    [root@centos76 data]# echo $a
    
    

    用source执行

    [root@centos76 data]# source test.sh
    -bash: err: 没有那个文件或目录
    hello
    # test.sh在当前bash执行 所以能访问
    [root@centos76 data]# echo $a
    1
    

    相关文章

      网友评论

          本文标题:linux之shell、bash、source和sh的区别

          本文链接:https://www.haomeiwen.com/subject/eawoirtx.html