第八章Linux shell基础知识预习笔记加课堂笔记
8.1 shell介绍
每个用户都有自己bash /bin/bash
if for while循环 ,特定语法
8.2 命令历史
按向上的方向键查看之前的命令,存放在用户的家目录下
root都存放载这个文件里/root/.bash_history
history 查看之前的命令,最大存1000条
是由环境变量$HISTSIZE配置的
系统内置的环境变量
history -c 清空历史命令
/root/.bash_history下的命令是不会被删的
只有正常退出终端的时候才会被记录到.bash_history文件里面
修改这个值在/etc/profile配置文件下
修改完以后用souce /etc/profile或退出终端才会生效
更改历史命令格式
HISTTIMEFORMAT="%Y%m%d %H:%M:%S "
Y 年 m月 d日 H小时 M分钟 S秒 最后面有一个空格
永久生效写入到这个文件 /etc/profile
永久保存命令,加上特殊权限a 只能追加,不能删除
正常退出终端exit logout 如果没有正常退出的话,命令就保存的不全
!! 两个叹号代表执行最后一条命令
!21 代表执行命令历史中第21条命令(history)
!cha 代表执行命令历史中最近一次以cha开头的命令
8.3 命令补全和别名
tab键可以补全一个命令,文件路径,文件名
centos7 支持参数补全
yum install -y bash-completion 安装bash-completion就支持参数补全了
重启后生效
alias 自定义别名 alias restartnet='systemctl restart network.service'
用户家目录下配置别名的文件~/.bashrc 里面
其他的别名在/etc/profile.d/下目录下定义的
unalias restartnet 取消自定义别名
8.4 通配符
* 通配符 匹配零个或多个字符
?匹配一个字符
ls [0-3].txt 指定一个范围0到3,也可以指定大小写字母a-z A-Z,
ls {1,2,3,4,a}.txt 花括号也可以指定,但是需要逗号分隔
8.5 输入输出重定向
cat 1.txt > 2.txt 一个大于号代表把1.txt的内容重定向到2.txt里面,把2.txt里面原来的内容删除了
cat 1.txt >> 2.txt 两个大于号代表把1.txt的内容追加到2.txt里面,不会删除原来的内容
2> 错误输出重定向 2>> 错误输出追加重定向
&> 是正确和错误输出的结合,把正确和错误的信息输入同一个文件
&>> 同样也支持追加重定向
ls [12].txt aaa.txt > 1.txt 2>a.txt 可以把正确和错误的输出信息重定向到不同的指定文件里面
> 正确 2>错误
wc -l < 1.txt 输入重定向,wc -l 是查看一个文件有多少行,前面必须是一个命令
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了
ls 1.txt aaa.txt >a.txt 2>&1 正确和错误输出到同一文件中
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。
8.6 管道符和作业控制
| 管道符是把前面输出的内容传递给后面的命令
ctrl + z 暂停一个任务
jobs 查看后台的任务
fg 把后台任务调到前台,不加id默认调最后一个任务
bg 把任务调到后台并运行,不加id默认调最后一个任务
命令后面加&符号,可以把命令丢到后台并运行
8.7 shell变量(上)
系统的变量通常是大写的英文字母,变量的值可以是数字或字符串
env 查看系统的常用环境变量
set 不仅可以查看的系统的环境变量,还可以查看用户的自定义变量
变量名规则:数字,字母,下划线 首位不能为数字
变量值有特殊字符的时候用单引号括起来
单引号可以脱意
变量的叠加
多个变量叠加的时候,用双引号引起来
8.8 shell变量(下)
export设置一个全局变量,只能往子shell继承(往下继承),对当前终端生效,新开的终端不起作用
pstree查看当前用户在那个bash下
运行bash进入一个子shell
unset 取消全局变量
全局变量只能往下继承
unset 取消全局变量
8.9 环境变量配置文件
系统层面
/etc/profile 用户登录的时候会加载到
/etc/bashrc 系统执行shell脚本的时候,或者是打开一个shell会执行里面的变量
用户层面
~/.bashrc ~/.bash_profile ~/.bash_history ~/.bash_logout
如果有需求的话,可以编辑用户家目录下的.bashrc .bash_profile,这里只对当前用户生效,全局配置的话要在/etc/profile下配置
. ~/.bashrc 前面的点等同于 source 加载配置文件里面的一些配置
用户~/.bash_profile 会调用 ~/.bashrc
用户~/.bashrc 会调用 /etc/bashrc
.bash_history 用户的历史命令
.bash_logout 定义用户退出时做的一些操作
例如用户退出时删除历史命令的操作,就一条命令 history -c
PS1 变量
用户名 主机名 大写W是目录的最后一个层级,小写w 显示的是目录的绝对路径
第八章课堂笔记
- 命令历史
- 命令补全
- 命令别名
- 通配符
- 输入输出重定向
- 管道符
- 作业控制
- Shell 变量
- 环境变量配置文件
- 命令历史
- 命令补全
- 命令别名
- 通配符
- 输入输出重定向
- 管道符
- 作业控制
- Shell 变量
- 环境变量配置文件
1. 命令历史(history)
Linux 可以记录每个用户所使用的命令, 并记录到 ~/.bash_history 文件中
当用户以 bash 登入 Linux 主机后, 系统会主动地由 ~/.bash_history 读取命令历史
当用户注销时, 会将最近的 HISTFILESIZE 个记录写入 ~/.bash_history 文件中
1.1 相关文件及变量
- 文件: ~/.byash_history
- 变量: HISTFILE=/home/<user>/.bash_history or /root/.bash_history # 指定 history 文件
- 变量: HISTFILESIZE=1000 # history 文件最大的命令记录条数(在.bash_history记录)
- 变量: HISTSIZE=1000 # 当前环境最大的命令记录条数
HISTFILESIZE与HISTSIZE的区别 http://www.cnblogs.com/fyc119/p/6964775.html
1.2 history 命令用法
35 history # 不是清空了吗? 怎么新的命令是从35开始计数?
- history -r: 将 history 文件中的命令记忆读出到当前内存中 #一般登录时会自动进行
- history -w: 将目前的内存中的命令记忆写入 history 文件中 # 一般登出时会自动进行
1.3 命令历史相关的使用技巧
[[email protected] ~]# history 10 998 echo $myname 999 init0 1000 init 0 1001 env 1002 set 1003 history 3 1004 history 10 1005 echo $myname 1006 myname='Choco Lee' 1007 history 10 [[email protected] ~]# !998 # 执行了第998条命令, 即 echo $myname echo $myname Choco Lee
[[email protected] ~]# !998 echo $myname Choco Lee
[[email protected] ~]# !! # 上面的命令又执行了一遍 echo $myname Choco Lee
[[email protected] ~]# history 5 1014 history 5 1015 ls /etc/ 1016 ls / 1017 echo $myname 1018 history 5
[[email protected] ~]# !ls # 执行了最近的一条以 ls 开头的命令, 即 ls /
ls / bin dev home lib64 mnt proc run srv tmp usr boot etc lib media opt root sbin sys
2. 命令补全(『Tab』)
3. 命令别名(alias、unalias)
命令太长?常用命令的选项太多?有些命令后果严重,想在执行前进行提醒?
[[email protected] ~]# alias 查看当前系统的别名
3.2 设置命令别名
[[email protected] ~]# alias lm='ll -a | more'
3.3 命令别名的相关文件
其实只要是用户登录后会调用的环境配置文档中自定义命令别名的设置语句,都能实现命令别名的固定
看一下 ~/.bashrc # 下列是 root 用户的 ~./bashrc 文件, 为安全起见已进行了部分别名设置, 但普通用户一般不会有这样的别名设置
[[email protected] ~]# cat .bashrc
# .bashrc # User specific aliases and functions alias rm='rm -I' alias cp='cp -I' alias mv='mv -I' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
3.4 取消命令别名
4. 通配符与特殊符号
符号 |
意义 |
* |
代表0-无穷个 任意字符 |
? |
代表有且只有一个字符 |
[ ] |
代表有且仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579] |
[-] |
同上,只不过是一个范围,如[ 0-9 ],[a-z]等 |
[^] |
有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母 |
符号 |
内容 |
# |
批注号 |
\ |
转义符号,将特殊字符或通配符还原成一般字符 |
| |
管道符 |
; |
命令衔接符,连续执行两条命令 |
~ |
当前用户家目录 |
$ |
取用变量符号 |
& |
工作控制,将指令变成后台工作 |
! |
逻辑非 |
>、>> |
数据流重定向,output |
<、<< |
数据流重定向,input |
' ' |
单引号,无法引用变量 |
" " |
双引号,可以引用变量 |
` ` |
指令引用,功能同 $(command) |
先看看正常情况下,执行命令时,数据流的走向
5.1 standard output & standard error output
标准输出,即命令成功执行时,将执行结果输出至文件 or 设备
5.1.1 标准输出(覆盖): >
如果多次命令的结果导出至同一个文件, 并采用覆盖方式,那该文件将仅保留最后一次输出的结果
5.1.2 标准输出(追加): >>
如果多次命令结果导出至同一个文件,若采用追加方式,那每次命令的结果都会追加至该文件的末尾
5.1.3 标准错误输出(覆盖): 2>
5.1.4 标准错误输出(追加): 2>>
5.1.5 同时进行标准输出与标准错误输出
如果同时想将正常输出与错误输出都导入到同一个文件,且按照顺序,使用 2>&1 或 &>
5.2 standard input
[[email protected] ~]# cat > aaa
123
456 [Ctrl + d]
[[email protected] ~]# cat aaa
123
456
[[email protected] ~]# cat > aaa < .bashrc # .bashrc 的内容替换了屏幕输入,并被放到 aaa 文件中
5.2.2 标准输入(以 指定字符 结束)
[[email protected] ~]# cat > bbb << fuckoff
> 123123
> 456456
> fuckoff
/dev/null 黑洞设备
6. 管道符
管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件
ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工
ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字
7. 作业控制
当你希望同时执行多项耗时较长的任务时, 虽然 tty 有多个, 但是来回切换也是很麻烦的
- foreground: 前台, 平常执行命令的界面
- background: 后台, 看不到的地方
- 什么样的工作适合放到后台: 不需要与用户交互的命令
- 放入后台的工作是无法用 Ctrl + c 来终止的
- 后台的工作有两种状态: 挂起(suspend) 和 运行中( running)
7.2 直接将命令放到后台运行(&)
[[email protected] tmp]# vim aaa &
[1] 2561
加上&后, 命令直接被甩到后台进行执行, 在执行完成后会在前台弹出提示
但是, 如果执行的命令带有 stdout 或 stderr 时(如 tar -v), 则大量信息仍然会扔到前台来, 所以此时最好用上数据流重定向(推荐 2>&1
7.3 将正在运行的命令扔到后台,且置为暂停(ctrl+z)
任何正在执行的任务, 在按下 ctrl+z 后, 都会被扔到后台, 且置为"暂停"状态
代码中看到每暂停一个工作, 提示信息里就显示一个数字和一个加号, 数字表示该任务目前在后台的编号, 而加号则代表该任务是最新的一个被扔后台的任务
[[email protected] tmp]# jobs
[1] 已停止 vim aaa
[2]- 已停止 vim bbb
[3]+ 已停止 vim ccc
jobs 的选项:
7.5 将后台工作拿回到前台来(fg)
再次扔回后台的命令将带有加号, 因为 加号/减号 分别代表 最新/次新, 是个相对的概念, 所以在前后台切换的过程中会不断变化
7.6 将后台暂停的任务**
7.7 kill 命令(简)
pkill pname 进程名
8. Shell 变量
推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用
8.2 变量的命名
8.3 变量的设定
注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来
注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来
8.4 变量的相关命令
[[email protected] ~]# echo $LANG zh_CN.UTF-8
8.4.3 env
- HOME: 当前用户的家目录
- HOSTNAME: 该主机的主机名
- USER: 当前用户的用户名
- SHELL: 当前使用的 shell 类型
- HISTSIZE: 可存储的历史命令条数
- MAIL: 当前用户的邮箱
- PATH: 可执行命令的所在目录
- LANG: 当前语系
- PS1: 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
- PS2: 输入命令时强制换行后的提示符
- OSTYPE: 当前操作系统类型
- MACHTYPE: 安装的机器类型
- HOSTTYPE: 主机的位数, x86 还是 x86_64
9. 环境变量配置文件
但是各个文件中可能又会调用其他的文件,所以一般来说,login shell 读取的文件如下图所示:
- non-login shell:取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码
9.2 /etc/profile (login shell)
- PATH:根据 UID 决定PATH 变量是否要包含 sbin 目录
- USER:根据 id 命令的结果,显示用户名
- LOGNAME:等于 USER
- MAIL:配置好用户的邮箱
- HOSTNAME:根据 hostname 指令,决定该变量值
- HISTSIZE:直接设定历史命令记录的条数为 1000
/etc/profile.d/ 下的脚本,主要是进行 bash 颜色、语系、vi 的别名、which 的别名等设置
9.3 ~/.bash_profile (login shell)
根据之前流程图的描述,bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。
其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile
为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。
9.3.1 三种文件的读取顺序及规律
其实 bash 的 login shell 只会读取上述文件中的其中一个, 读取顺序依照上面的排序, 一旦读取到其中一个文件, 就不再继续读取其余文件
9.3.2 ~/.bash_profile 内容
~/.bash_profile 调取了 ~/.bashrc 文件, 并将 ~/bin 目录加入到 PATH 变量中
9.4 ~/.bashrc (non-login shell)
当通过 non-login shell 取得 bash 后, 仅会读取 ~/.bashrc 文件
定义了几个别名, 然后又调用了 /etc/bashrc
ps. 如果家目录下没有 .bashrc 文件, 那么你的 bash 提示符可能会变成如下样子
但是没关系, 还记得 /etc 下有个模板目录吗? 就是 /etc/skel/. 把该目录下的 .bashrc 文件复制到家目录即可.