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

2022-07-26  本文已影响0人  oceanfly

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
上一篇下一篇

猜你喜欢

热点阅读