Shell基础知识
什么是shell
shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.默认安装版本是bash,他是sh的增强版本.
1.记录命令历史history
history默认记录最近执行的1000条命令,这些命令是保存在用户家目录下的.bash_history下. 正常退出shell,才会保存.
history -c //清除当前内存内的全部命令记忆
-
!!: 连续两个!表示执行上一条命令
-
!n: n指数字,表示执行命令历史中第n行命令.
-
!字符串(字符串大于等于1)
[root@localhost ~]# !pw
pwd
/root
2.别名alias
bash特有功能之一,通过alias把一个常用很长的命令取个简单易记的名字, unalias可以解除别名
格式: alias[命令别名]=[具体命令]
如果在 bash 中设置命令别名,则重启后别名失效
####3. 通配符 与特殊符号 ####
符号 意义
* 代表0-无穷个 任意字符
? 代表有且只有一个字符
[ ] 代表有且仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579]
[-] 同上,只不过是一个范围,如[ 0-9 ],[a-z]等
[^] 有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母
特殊符号
符号 内容
# 批注号
\ 转义符号,将特殊字符或通配符还原成一般字符
| 管道符
; 命令衔接符,连续执行两条命令
~ 当前用户家目录
$ 取用变量符号
& 工作控制,将指令变成后台工作
! 逻辑非
>、>> 数据流重定向,output
<、<< 数据流重定向,input
' ' 单引号,无法引用变量
" " 双引号,可以引用变量
` ` 指令引用,功能同 $(command)
4.输入,输出重定向
执行命令,数据流走向
####standard output & standard error output
标准输出,即命令成功执行时,将执行结果输出至文件 or 设备 符号:> (覆盖导出) 或 >> (追加导出)
-
标准输出(覆盖): >如果多次命令的结果导出至同一个文件, 并采用覆盖方式,那该文件将仅保留最后一次输出的结果
-
标准输出(追加): >>如果多次命令结果导出至同一个文件,若采用追加方式,那每次命令的结果都会追加至该文件的末尾
-
标准错误输出(覆盖): 2>
-
标准错误输出(追加): 2>>
-
同时进行标准输出与标准错误输出,如果同时想将正常输出与错误输出都导入到同一个文件,且按照顺序,使用 2>&1 或 &>
标准输入(以 Ctrl + d 结束) [root@choco-01 ~]# cat > aaa 123 456 [Ctrl + d]
[root@choco-01 ~]# cat aaa 123 456
[root@choco-01 ~]# cat aaa
[root@choco-01 ~]# cat > aaa < .bashrc # .bashrc 的内容替换了屏幕输入,并被放到 aaa 文件中
[root@choco-01 ~]# cat aaa # .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
标准输入(以 指定字符 结束)
[root@choco-01 ~]# cat > bbb << "fuckoff" > 123123 > 456456 > fuckoff [root@choco-01 ~]#
6.管道符
用于将前一个指令的输出作为后一个指令的输入, 管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件
例子:
ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工
ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字
巧用垃圾桶
Linux 下有一个特殊的设备 /dev/null ,所有被写入该设备的东西都会消失,所以如果有部分信息不想输出至文件,也不想输出至屏幕,那就输出至 /dev/null 吧
作业控制
当运行一个进程时,你可以使它暂停(按 Ctrl+z),然后使用 fg 命令恢复它,利用 bg 命令使他到后台运行,你也可以使它终止(按 Ctrl+c)。
1.查看后台中的任务jobs
[root@localhost tmp]# jobs [1] 已停止 vim aaa [2]- 已停止 vim bbb [3]+ 已停止 vim ccc
加号: 最新被扔进来的
减号: 次新被扔进来的
更早被扔进来的就不带符号了
jobs 的选项:
- -l:同时列出任务的 PID
-
-r: 仅列出后台中处于 "running" 的任务
-
-s: 仅列出后台中处于 "stop" 的任务
jobs,可以看到在被暂停或者在后台运行的任务,使用 jobs 命令可以看到两个或多个任务,那么使用 bg 或者 fg 的时候,就需要在后面加一个编号了
2.后台工作拿到前台来或后台暂停任务的激活,不加编号, 默认会先将带加号执行. 最新被扔进来的
3.丢入后台需要使用在命令后边加一个&符号,中间有个空格
4.kill 命令语法很简单,直接在后面加 pid 即可,如果遇到杀不死的进程时,可以在 kill 后面加一个选 项: kill -9 [pid]
kill 的用法
kill -<signal> %<job_num>
或
kill -<signal> <PID>
常用 signal
-
-1: 重新读取参数的配置文件(类似 reload)
-
-9: 立即强制删除一个任务
-
-15: 已正常方式结束一个任务
kill 默认是以 PID 来进行进程杀死的, 若要杀死某个任务号, 则任务号前必须加 %
-9是暴力杀死, -15是温柔杀死, 两者的区别在杀死 vim 时较为明显: 若用 -9 杀死, 则会留有 .filename.swp 文件, 下次再进行 vim 时会有修复提示; 而若用 -15 杀死, 则能较好地料理后事, 不会有这种缓存文件存在.
shell变量
变量的种类
环境变量
往往以纯大写来命名, bash 的子进程中仍可使用
自定义变量
推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用
变量的命名
由字母、数字、下划线组成,且只能以非数字开头
变量的设定
语法:变量名=变量值
注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来
注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来
变量的相关命令
echo 功能:打印变量的内容
export 功能:将变量转换为环境变量
[root@choco-01 ~]# echo $full Choco Lee @ China [root@choco-01 ~]# bash [root@choco-01 ~]# echo $full # 进入子 shell 后, 变量失效 [root@choco-01 ~]# exit exit [root@choco-01 ~]# export full # 声明该变量为环境变量 [root@choco-01 ~]# bash [root@choco-01 ~]# echo $full # 进入子 shell 后, 变量仍让有效 Choco Lee @ China
env 功能:查看环境变量
declare 用法: declare [-aixr] <var_name>
选项:
-
-a:定义变量为数组
-
-i:定义变量为纯数字
-
-x:定义变量为环境变量
-
-r:定义变量为 readonly
常用环境变量
HOME: 当前用户的家目录
HOSTNAME: 该主机的主机名
USER: 当前用户的用户名
SHELL: 当前使用的 shell 类型
HISTSIZE: 可存储的历史命令条数
MAIL: 当前用户的邮箱
PATH: 可执行命令的所在目录
LANG: 当前语系
PS1: 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
PS2: 输入命令时强制换行后的提示符
OSTYPE: 当前操作系统类型
MACHTYPE: 安装的机器类型
HOSTTYPE: 主机的位数, x86 还是 x86_64
环境变量配置文件
1.login与non-login
- login shell:取得 bash 时需要完整的登录流程。如由 tty1-tty6登录时,需要输入用户的账号和密码
读取的文件:
-
/etc/profile :系统整体的设定,对所有用户皆生效
-
~/.bash_profile 或 ~/.bash_login 或 ~/.profile:用户的个人设定 但是各个文件中可能又会调用其他的文件,所以一般来说,login shell 读取的文件如下图所示:
- non-login shell:取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码
2./etc/profile (login shell)
该文件会根据用户的 UID 设定好许多环境变量以及参数
设定环境变量
- PATH:根据 UID 决定PATH 变量是否要包含 sbin 目录
- USER:根据 id 命令的结果,显示用户名
- LOGNAME:等于 USER
- MAIL:配置好用户的邮箱
- HOSTNAME:根据 hostname 指令,决定该变量值
- HISTSIZE:直接设定历史命令记录的条数为 1000
调用 /etc/profile.d/*.sh
for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$I" else . "$i" >/dev/null fi fi done
/etc/profile.d/ 下的脚本,主要是进行 bash 颜色、语系、vi 的别名、which 的别名等设置
3.~/.bash_profile (login shell)
根据之前流程图的描述,bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。
其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile
为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。
所以我们往往只能见到 ~/.bash_profile 而已
三种文件的读取顺序及规律
~/.bash_profil
~/.bash_login
~/.profile
其实 bash 的 login shell 只会读取上述文件中的其中一个, 读取顺序依照上面的排序, 一旦读取到其中一个文件, 就不再继续读取其余文件
.~/.bash_profile 内容
[root@localhost ~]# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH
~/.bash_profile 调取了 ~/.bashrc 文件, 并将 ~/bin 目录加入到 PATH 变量中
4.~/.bashrc (non-login shell)
当通过 non-login shell 取得 bash 后, 仅会读取 ~/.bashrc 文件
先来看看 ~/.bashrc 的内容吧
[root@localhost ~]# 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
定义了几个别名, 然后又调用了 /etc/bashrc
/etc/bashrc 会完成以下任务
- 根据不同的 UID 设置 umask 值
- 根据不同的 UID 设置 PS1 变量
- 调用 /etc/profile.d/*.sh
ps. 如果家目录下没有 .bashrc 文件, 那么你的 bash 提示符可能会变成如下样子 -bash-4.2#
但是没关系, 还记得 /etc 下有个模板目录吗? 就是 /etc/shel/. 把该目录下的 .bashrc 文件复制到家目录即可.