第八章 Shell基础知识
一、shell介绍
二、命令历史
三、命令补全和别名
四、通配符
五、输入输出重定向
六、管道符和作业控制
七、shell变量
八、环境变量配置文件
一、shell介绍
1.1什么shell?
- ①shell是系统跟计算机硬件监护室使用的中间介质,它只是系统的一个工具。
- ②shell是一个命令解释器,提供用户和机器之间的交互。用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。例:在Linux中,输入用户账号密码,进去的界面就是一个shell。
- ③每个用户都可以有自己特定的shell(用户配置,/etc/passwd最后一段就是用户的shell)
- ④Centos7默认的shell为bash(Bourne Again Shell)。它是sh(Bourne shell)的增强版,Bourne是开发创始人。
- ⑤支持特定语法,比如逻辑判断、循环等
- ⑥还有ksh、zsh等
注:Linux的shell简单说就是一个命令行和用户交互的过程,打命令就会出现结果。类似Windows下的cmd窗口。
二、命令历史
2.1我们执行过的命令Linux都会记录,预设可以记录1000条历史命令。这些命令保存在用户的家目录.bash_history中。
2.2历史命令
2.2.1 history 命令用法
- history命令:表示之前输入的命令。
- 存放位置:存放在用户家目录下 .bash_history
- 默认历史记录记录1000条(有时会显示大于1000,例如1005,因为命令暂时存放在内存中,为写入文件)
- 写入的命令需要在退出终端后才会写入文件中,不然会存放在内存里,非正常退出终端时,命令不会保存
- #cat .bash_history显示命令历史信息
- history n:n表示数字,列出最近的 n条命令
- history -c::清除当前内存内的全部命令历史,不会清除配置文件
- history -r::将 history 文件中的命令记忆读出到当前内存中 (一般登录时会自动进行)
- history -w:将目前的内存中的命令记忆写入 history 文件中 (即强制写入,一般登出时会自动执行)
2.2.2变量
- 变量HISTSIZE:配置命令历史记录条数
- echo $HISTSIZE :输出HISTSZIE的值
- /etc/profile:存储变量文件。可在/etc/profile中修改变量信息,修改后#soure /etc/profile才能生效
- HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S":进行history时,输出的仅有***和命令,没有运行时间,这时需要定义HISTTIMEFORMAT格式。(HISTTIMEFORMAT定义后,仅在当前用户下生效,想要在其他用户或终端下执行,需要在/etc/profile中修改,添加HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S"这一项,并#soure /etc/profile,生效)
- 永久保存命令历史:chattr +a ~/.bash_history(a权限表示只能追加,不能删除)。如果需要永久保存命令历史,执行这条命令后,HISTSIZE可以不修改
2.2.3使用技巧
- !n: 执行 history 命令显示的 第n条命令
- !! :执行上一条命令
- !word: 在命令历史是倒着查找并执行最近的一条以word字符串开头的命令
三、命令补全和别名
3.1命令补全
Tab键:按一下补全以某个字符开头的命令;按两下,列出以某个字符开头的所有命令
参数补全:centos7支持参数补全,需要安装bash_completion。安装后重启或Ctrl+d断开终端重新连接后生效
3.2别名
我们看一看通过alias把一个常用的并且很长的命令另取为一个简单易记的指令。
- 直接执行alias:查看当前已经存在的命令别名
- 自定义命令别名,格式:alias 【命令别名】=‘具体的命令’
- 每个用户都有自己配置别名的文件:存放在用户家目录下的~/.bashrc中
- 自定义的别名,只针对当前用户生效,在其他用户或终端不生效;想要在其他用户或终端下生效,需要在/etc/profile.d中修改。
- ls /etc/profile.d
- unalias 别名:取消别名
注:alias重启后会失效,可以在/etc/bashrc或用户家目录下的.bashrxc中修改
四、通配符
- 通配符
符号 |
意义 |
* |
代表0-无穷个 任意字符 |
? |
代表有且只有一个字符,例22.txt就不会识别 |
[ ] |
或的意思,匹配一个就可以。仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579] |
[-] |
或的意思,匹配一个就可以。只不过是一个范围,如[ 0-9 ],[a-z]等 |
[^] |
非的意思,有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母 |
符号 |
内容 |
# |
批注号 |
\ |
转义符号,将特殊字符或通配符还原成一般字符 |
| |
管道符 |
; |
命令衔接符,连续执行两条命令 |
~ |
当前用户家目录 |
$ |
取用变量符号 |
& |
工作控制,将指令变成后台工作 |
! |
逻辑非 |
>、>> |
数据流重定向,output |
<、<< |
数据流重定向,input |
' ' |
单引号,无法引用变量 |
" " |
双引号,可以引用变量 |
` ` |
指令引用,功能同 $(command) |
五、输入输出重定向
5.1输入输出重定向
- >:输出重定向。把前面的执行结果输出至文件 or 设备。(会覆盖之前的内容)
- >>:输出重定向。把前面的执行结果输出至文件 or 设备。(追加到之前内容的后面)
- <:输入重定向。把后面的执行结果输入到前面的命令中。(前面必须是命令)例:wc -l <1.txt
- <<:输入重定向。把后面的执行结果输入到前面的命令中。需要配合>使用,(以 Ctrl + d 结束)。例:
5.2错误输入输出重定向
- 2>:错误输出重定向。把前面的执行结果输出至文件 or 设备。(会覆盖之前的内容)
- 2>>:错误输出重定向。把前面的执行结果输出至文件 or 设备。(追加到之前内容的后面)
- >+2>:把正确信息输入到一个文件中,错误信息输入到一个文件中,可以输入到同一个文件(会覆盖之前的内容)
- >+2>==&>
- >>+2>>:把正确信息输入到一个文件中,错误信息输入到一个文件中,可以输入到同一个文件(追加到之前内容的后面)
- >>+2>>==&>>
5.3巧用垃圾桶(黑洞)
Linux 下有一个特殊的设备 /dev/null ,所有被写入该设备的东西都会消失,所以如果有部分信息不想输出至文件,也不想输出至屏幕,那就输出至 /dev/null 吧
六、管道符和作业控制
6.1管道符:把前面的结果输入到后面的命令。
管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件。
- ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工
- ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字
6.2作业控制
6.2.1基本概念
- foreground: 前台, 平常执行命令的界面
- background: 后台, 看不到的地方
- 什么样的工作适合放到后台: 不需要与用户交互的命令
- 放入后台的工作是无法用 Ctrl + c 来终止的
- 后台的工作有两种状态: 暂停(stop) 和 运行中( running)
6.2.2用法
- ctrl+z:将正在运行的命令扔到后台,且置为暂停(任何正在执行的任务, 在按下 ctrl+z 后, 都会被扔到后台, 且置为"暂停"状态代码中看到每暂停一个工作, 提示信息里就显示一个数字和一个加号, 数字表示改任务目前在后台的编号, 而加号则代表该任务是最新的一个被扔后台的任务)
- jobs:查看后台中的任务(包括已暂停的,且只在当前终端下有效)
- 加号: 最新被扔进来的
- 减号: 次新被扔进来的
- 更早被扔进来的就不带符号了
- fg【id】:将后台工作拿回到前台来;不加任务号则将带加号的拿回来
- bg【id】:把任务调到后台/将后台暂停的任务**;不加任务号则将在后台**带加号的任务
- 命令后加&直接把命令丢到后台
6.2.3其他方法
如果想要直接移除后台的任务怎么做?
kill 命令:
- kill 的用法
kill -<signal> %<job_num>或kill -<signal> <PID>
常用 signal
pkill用法:
pkill 进程名 :删除进程
6.2.4 #vmstat 1 :会不停的显示系统信息(过程中可以敲命令,但是命令窗口会被系统信息替换),以Ctrl+z退出
6.2.5 #ps aux 获取进程ID
七、shell变量
7.1 变量的种类
推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用
注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来
注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来(单引号认为特殊符号为字符,而不是变量的前缀)
7.4 查看变量信息
7.4.1env
功能:查看环境变量
7.4.2 set
set命令查看到的变量包含了自定义变量
7.5变量的累加
7.5.1 echo
7.6 export
7.7 unset 变量名:取消变量
7.8 declare
- HOME: 当前用户的家目录
- HOSTNAME: 该主机的主机名
- USER: 当前用户的用户名
- SHELL: 当前使用的 shell 类型
- HISTSIZE: 可存储的历史命令条数
- MAIL: 当前用户的邮箱
- PATH: 可执行命令的所在目录
- LANG: 当前语系
- PS1: 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
- PS2: 输入命令时强制换行后的提示符
- OSTYPE: 当前操作系统类型
- MACHTYPE: 安装的机器类型
- HOSTTYPE: 主机的位数, x86 还是 x86_64
八、环境变量配置文件
8.1 login 与 non-login
login shell:取得 bash 时需要完整的登录流程。如由 tty1-tty6登录时,需要输入用户的账号和密码
取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码
8.3 /etc/profile (login shell)
- PATH:根据 UID 决定PATH 变量是否要包含 sbin 目录
- USER:根据 id 命令的结果,显示用户名
- LOGNAME:等于 USER
- MAIL:配置好用户的邮箱
- HOSTNAME:根据 hostname 指令,决定该变量值
- HISTSIZE:直接设定历史命令记录的条数为 1000
/etc/profile.d/ 下的脚本,主要是进行 bash 颜色、语系、vi 的别名、which 的别名等设置
8.4 ~/.bash_profile (login shell)
bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。
其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile
为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。
其实 bash 的 login shell 只会读取上述文件中的其中一个, 读取顺序依照上面的排序, 一旦读取到其中一个文件, 就不再继续读取其余文件
~/.bash_profile 调取了 ~/.bashrc 文件, 并将 ~/bin 目录加入到 PATH 变量中
8.5 ~/.bashrc (non-login shell)
当通过 non-login shell 取得 bash 后, 仅会读取 ~/.bashrc 文件