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
网友评论