命令历史
命令补全
命令别名
通配符
输入输出重定向
管道符
作业控制
Shell 变量
环境变量配置文件
命令历史(history)
Linux 可以记录每个用户所使用的命令, 并记录到 ~/.bash_history 文件中
当用户以 bash 登入 Linux 主机后, 系统会主动地由 ~/.bash_history 读取命令历史
当用户注销时, 会将最近的 HISTFILESIZE 个记录写入 ~/.bash_history 文件中
相关文件及变量
文件: ~/.byash_histor
变量: HISTFILE=/home/<user>/.bash_history or /root/.bash_history # 指定 history 文件
变量: HISTFILESIZE=1000 # history 文件最大的命令记录条数
变量: HISTSIZE=1000 # 当前环境最大的命令记录条数
history 命令用法
history 命令用法
history #: 列出最近的 # 条命令
[root@yuzaoqian ~]# history 5
71 cd l
72 cd /
73 ll
74 history
75 history 5
history -c: 清除当前内存内的全部命令记忆
[root@yuzaoqian ~]# history -c ;history
[root@yuzaoqian ~]# history
命令历史相关的使用技巧
!<#> 执行 history 命令显示的 第 # 条命令
!! 执行上一条命令
!<keywords> 执行最近的一条以< keywords> 开头的命令
命令补全(『Tab』)
非常提高工作效率的东西
这东西没法上代码,自己尝试吧,谁用谁知道。
按一下:能进行 『命令』 以及 『文件名』 的补全
按两下:能够罗列出所有符合补全的可能选项
命令别名(alias、unalias)
命令太长?常用命令的选项太多?有些命令后果严重,想在执行前进行提醒?
—— 用命令别名啊
查看当前已经存在的命令别名
[root@yuzaoqian ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
设置命令别名
alias xx=xxx -x x -x x
命令别名的相关文件
如果在 bash 中设置命令别名,则重启后别名失效
其实只要是用户登录后所有会调用的环境配置文档中写入自定义命令别名的设置语句,都能实现 命令别名的固定
看一下 ~/.bashrc # 下列是 root 用户的 ~./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
取消命令别名
unalias <别名>
[root@localhost ~]# alias
alias cp='cp -I'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias lm='ll -a | more' # 当前 alias 中存在 lm
alias ls='ls --color=auto'
alias mv='mv -I'
alias rm='rm -I'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# unalias lm ; alias # 取消 lm 的别名后,发现别名中已没有 lm
alias cp='cp -I'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -I'
alias rm='rm -I'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
通配符与特殊符号
通配符
符号 意义
* 代表0-无穷个 任意字符
? 代表有且只有一个字符
[ ] 代表有且仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579]
[-] 同上,只不过是一个范围,如[ 0-9 ],[a-z]等
[^] 有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母
特殊符号
# 批注号
\ 转义符号,将特殊字符或通配符还原成一般字符
| 管道符
; 命令衔接符,连续执行两条命令
~ 当前用户家目录
$ 取用变量符号
& 工作控制,将指令变成后台工作
! 逻辑非
>、>> 数据流重定向,output
<、<< 数据流重定向,input
' ' 单引号,无法引用变量
" " 双引号,可以引用变量
` ` 指令引用,功能同 $(command)
输入输出重定向
standard output & standard error output
标准输出,即命令成功执行时,将执行结果输出至文件 or 设备
符号:> (覆盖导出) 或 >> (追加导出)
标准输出(覆盖): >
如果多次命令的结果导出至同一个文件, 并采用覆盖方式,那该文件将仅保留最后一次输出的结果
[root@choco-01 ~]# cat /etc/motd
/\ /\ |
/ \ / \ |
/ \ / \ |
|
----- .
[root@choco-01 ~]# cat /etc/motd > aaa #屏幕上不再显示笑脸,原本该输出至屏幕的内容,现在输出至 aaa 文件了
[root@choco-01 ~]# cat aaa
/\ /\ |
/ \ / \ |
/ \ / \ |
|
----- .
既然是覆盖导出,我们再导出一个数据流到 aaa 文件,然后看看 aaa 文件变成啥样了
[root@choco-01 ~]# ls / > aaa
[root@choco-01 ~]# cat aaa # 原本的内容不见了
777
bin
boot
dev
disk-test
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
test
tmp
usr
var
YUM
标准输出(追加): >>
如果多次命令结果导出至同一个文件,若采用追加方式,那每次命令的结果都会追加至该文件的末尾
[root@choco-01 ~]# echo "asdfasdf" >> aaa
[root@choco-01 ~]# cat aaa
777
bin
boot
dev
disk-test
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
test
tmp
usr
var
YUM
aaa
anaconda-ks.cfg
col.man
expect-test
passwd
passwd.linux
tee.txt
asdfasdf # 看,最后一次导出的结果,被追加至该文件的末尾了
标准错误输出(覆盖): 2>
[root@choco-01 ~]# ls asdfasdf 2> bbb
[root@choco-01 ~]# cat bbb
ls: 无法访问asdfasdf: 没有那个文件或目录
[root@choco-01 ~]# ls haha 2> bbb
[root@choco-01 ~]# cat bbb
ls: 无法访问haha: 没有那个文件或目录
标准错误输出(追加): 2>>
[root@choco-01 ~]# cat bbb
ls: 无法访问haha: 没有那个文件或目录
[root@choco-01 ~]# ls 1234567 2>> bbb
[root@choco-01 ~]# cat bbb
ls: 无法访问haha: 没有那个文件或目录
ls: 无法访问1234567: 没有那个文件或目录
同时进行标准输出与标准错误输出
如果同时想将正常输出与错误输出都导入到同一个文件,且按照顺序,使用 2>&1 或 &>
<command> ><file> 2>&1 如: ls a b > report.txt 2>&1
[root@choco-01 ~]# ls
aaa anaconda-ks.cfg bbb ext
[root@choco-01 ~]# ls aaa asdfasdf > aaa
ls: 无法访问asdfasdf: 没有那个文件或目录 # 屏幕上显示了标准错误输出的信息
[root@choco-01 ~]# cat aaa
aaa # 文件中仅能看到标准输出的信息
[root@choco-01 ~]# ls aaa asdfasdf 2> bbb
aaa # 屏幕上显示了标准输出的信息
[root@choco-01 ~]# cat bbb
ls: 无法访问asdfasdf: 没有那个文件或目录 # 文件中仅能看到标准错误输出的信息
[root@choco-01 ~]# ls aaa asdfasdf > aaa 2>&1
[root@choco-01 ~]# cat aaa # 这样就都能看到了
ls: 无法访问asdfasdf: 没有那个文件或目录
aaa
standard input
原本需要由键盘输入的数据,改由文件内容来取代
5.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
123
456
[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 ~]#
巧用垃圾桶
Linux 下有一个特殊的设备 /dev/null ,所有被写入该设备的东西都会消失,所以如果有部分信息不想输出至文件,也不想输出至屏幕,那就输出至 /dev/null 吧
管道符
管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件
例子:
ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工
ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字
作业控制
当你希望同时执行多项耗时较长的任务时, 虽然 tty 有多个, 但是来回切换也是很麻烦的
这时可以用到 linux 下的 "工作管理"
基本概念
foreground: 前台, 平常执行命令的界面
background: 后台, 看不到的地方
什么样的工作适合放到后台: 不需要与用户交互的命令
放入后台的工作是无法用 Ctrl + c 来终止的
后台的工作有两种状态: 暂停(stop) 和 运行中( running)
直接将命令放到后台运行(&)
直接在待执行的命令的最后加上空格和 &
(工作中很难用到)
Shell 变量
变量的种类
环境变量
往往以纯大写来命名, bash 的子进程中仍可使用
自定义变量
推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用
变量的命名
由字母、数字、下划线组成,且只能以非数字开头
变量的设定
语法:变量名=变量值
注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来
注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来
变量的相关命令
echo
功能:打印变量的内容
[root@choco-01 ~]# echo $LANG zh_CN.UTF-8
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>
选项:
- readonly
常用环境变量
- 当前用户的家目录
- 该主机的主机名
- 当前用户的用户名
- 当前使用的 shell 类型
- 可存储的历史命令条数
- 当前用户的邮箱
- 可执行命令的所在目录
- 当前语系
- 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
- 输入命令时强制换行后的提示符
- 当前操作系统类型
- 安装的机器类型
- 主机的位数, x86 还是 x86_64
环境变量配置文件
login 与 non-login
- shell:取得 bash 时需要完整的登录流程。如由 tty1-tty6登录时,需要输入用户的账号和密码
读取的文件:
-
- :系统整体的设定,对所有用户皆生效
- 或 ~/.bash_login 或 ~/.profile:用户的个人设定
但是各个文件中可能又会调用其他的文件,所以一般来说,login shell 读取的文件如下图所示:
- shell:取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码
/etc/profile (login shell)
该文件会根据用户的 UID 设定好许多环境变量以及参数
设定环境变量
- UID 决定PATH 变量是否要包含 sbin 目录
- id 命令的结果,显示用户名
- USER
- hostname 指令,决定该变量值
- 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 的别名等设置
~/.bash_profile (login shell)
根据之前流程图的描述,bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。
其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile
为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。
所以我们往往只能见到 ~/.bash_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 变量中
~/.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 文件复制到家目录即可.