常见的shell解释器
Linux系统中的Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个”命令解释器“的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出结果。 它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
查看本机的shell信息:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
linux 中常见的shell
- bash:基于GUN的框架下发展的shell
- csh:类似C语言的shell
- tcsh:整合了csh 提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。
bash特性:
- 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
- 支持查看历史命令(history)
- 支持别名(alias)
- 标准输入和标准输出的重定向
- 管道符
- 文件名通配机制
- 支持命令hash
- 支持变量
这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。
脚本的执行方式
1、指定路径去执行文件,文件需要有执行权限。
- 绝对路径。如:/root/hello.sh
- 相对路径。如:./hello.sh
[root@localhost ~]# chmod +x hello.sh
[root@localhost ~]# /root/hello.sh //使用绝对路径执行脚本
hello stars
[root@localhost ~]# ./hello.sh //使用相对路径执行脚本
hello stars
2、指定解释器去执行(bash 脚本名),不需要执行权限。
- bash 脚本名。如:bash hello.sh
- “source 脚本名” 或 “ . 脚本名”。 //不会启动子shell环境
[root@localhost ~]# chmod -x hello.sh
[root@localhost ~]# ll hello.sh
-rw-r--r--. 1 root root 31 3月 30 20:27 hello.sh
[root@localhost ~]# bash hello.sh //bash执行脚本
hello stars
[root@localhost ~]# source hello.sh //source执行脚本
hello stars
[root@localhost ~]# . hello.sh // . 执行脚本
hello stars
注意:
- 执行脚本时的shell环境:
- source和 . 执行脚本时,会在当前shell环境中执行脚本。
- bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。
- 不建议使用source来执行脚本,可能会影响一些资源配置。
- 脚本中的空白行会被解释器忽略。
- 脚本中,除了shebang,余下所有以#开头的行,都回被视作注释行而被忽略。此即为注释行。
脚本错误调试
脚本错误类型:
- 命令错误: 命令错误不会影响接下来的命令,之后的命令会继续执行。
- 语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
- 逻辑错误: 执行后的效果不是自己想要的。需要自己去排查。
调试方法:
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
总结:脚本错误常见的有三种区别
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
- 逻辑错误:只能使用 bash -x 进行
重定向与管道符
由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。
标准输入与输出
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
类型 | 设备文件 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
---|---|---|---|---|
标准输入 | /dev/stdin | 0 | 从键盘获得输入 | /proc/self/fd/0 |
标准输出 | /dev/stdout | 1 | 输出到屏幕(即控制台) | /proc/self/fd/1 |
错误输出 | /dev/stderr | 2 | 输出到屏幕(即控制台) | /proc/self/fd/2 |
交互式硬件设备:
-
标准输入:从该设备接收用户输入数据。
-
标准输出:通过该设备想用户输出数据。
-
标准错误:通过该设备报告执行出错信息。
重定向
重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。
1、输入重定向
符号 | 作用 |
---|---|
命令 < 文件 | 从指定的文件读取文件,而不是从键盘输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1 作为命令的标准输入并将标准输出到文件2 |
2、输出重定向
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出结果保存到指定的文件中(覆盖原有内容) |
命令 >> 文件 | 将标准输出结果追加到指定的文件尾部 |
命令 2> 文件 | 将错误输出信息保存到指定文件中(覆盖原有内容) |
命令 2>> 文件 | 将错误输出信息追加到指定文件尾部 |
命令 > 文件 2>&1 | 混合输出,将标准输出与错误输出保存到文同一个文件中 |
命令 2> 文件 1>&2 | 同上 |
命令 &> 文件 | 同上 |
命令 >& 文件 | 同上 |
注:
- &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
- 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。
管道符
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。
linux下的管道符使用"竖杠"表示:| 。
格式:命令A | 命令B