8月14好上课笔记
命令历史
最基本的查看历史命令 history
history
!n 编号为n的历史命令
不用再复制粘贴,或者照着历史记录敲了。执行历史命令记录里面的某个命令,只需要 ! + 这条命令记录前的序号,比如
!767
这样就可以执行767序号对应的命令 ping www.tpircsboy.com
!-n 倒数第n个历史命令
你也可以用 ! - (倒数第几个命令)来执行历史命令,比如 !-1 就是倒数第一个命令, !-3就是倒数第三个命令
!-3
!! 上一条命令
!! 表示上一条命令,相当于 !-1 。
这是一个极为方便实用的命令,比如一条很长的命令而且需要管理员权限,但是好不容易敲完但忘记加sudo,这里就可以直接用 sudo !!来完成刚刚的那条复杂的命令加sudo
sudo !!
!keyword 查找包含该keyword的历史命令
如果想查找包含某个关键字的历史命令,可以这样做
!keyword
查找包含keyword的历史命令,然后回车就能执行这条历史命令
但是其实这个操作是很危险的,假如你看错或者记混了历史命令,在回车前你其实不知道要查找出的是哪条历史命令,而回车后这条命令就执行了,没有机会给你看一下查找出的命令具体是什么就执行了。很危险,不推荐这样做,可以使用 MagicSpace(见下文) 或者使用Ctrl + R 反向查找 (推荐)
Ctrl + R 反向查找命令
快捷键Ctrl + R ,然后输入要查找的关键字,输入的同时,bash就会动态地增量搜索,找到想要的历史命令后可以按回车执行,或者esc把这条提取命令出来但是不执行。再按Ctrl + R 则继续往后查找符合条件的命令。
history | grep keyword 列出所有符合条件的命令
Ctrl + R 无疑是最方便常用的历史记录搜索方式,但是当然也可以用 history | grep keyword 来查找所有的符合条件的记录,然后再结合刚刚的! 方法完成命令。
注意,以上所说的包含 ! 的技巧都是可以与别的命令拼接在一起的, 比如
sudo !-3 , time !472, sudo !apt
下面是一些关于历史记录的参数的技巧:
!$ 上一条命令的最后一条参数
如果说你只想用上条命令的参数,一个个打出来又太繁复,就可以这样
cd !$
当然这种情形下也有更简单的方法,等讲到快捷键部分再说
!^ 上一条命令的第一个参数
$ 表示最后一个参数,而 ^就表示的是第一个参数
!^ 在这样的一个应用场景里十分方便:你刚备份了一个配置文件,然后想编辑这个配置文件
vim !^
:n 第n个参数
^与$表示第一个参数和最后一个参数,而 :n 就表示第n个参数,比如 !:2就表示上一条命令的第2个参数
cd !:2
注意,参数符号不仅是可以 !$、!^、!:n 这样用,这些关于参数的符号都是可以和!表达式任意组合使用的,比如
-
cd !762:2 (表示762号历史命令的第2个参数)
-
ls !-3^ (表示倒数第3个命令的第一个参数)
-
dpkg -L !apt$ (表示搜索含apt的命令的最后一个参数)
magic-space 让历史记录表达式和参数符号立即显出原形
虽然历史记录表达式和参数符号使用起来简易方便,但是在包含这些表达式和符号的命令回车执行之前,你是并不知道这些表达式和符号到底代表的什么。为了解决这个问题,我们可以使用Magic-Space
bind Space:magic-space
使用了这个设置后,在bash中输入历史记录表达式和参数符号后,按一下空格,这些表达式和符号就立即变成它们所代表的历史命令和参数,简称magic space。
可以把这句放到.bashrc中,让设置持久生效(Mac是在.bash_profile)。
命令前加空格,使之不计入history
在命令前加空格,就可以避免改该命令计入history,小伙伴们就可以在不用清空history的前提下干一些坏事了。
HISTSIZE=0 不记录命令
如果不想记录命令,可以设置HISTSIZE=0。如果想恢复,可以在设置HISTSIZE为一个大于零的值(默认为500或者1000)
HISTCONTROL=ignoredups 去除重复命令
这样设置后,多次的同样的命令连续执行就会只记录一次。
命令补全和别名
命令补全
Tab不仅可以补全命令也可以补全文件路径 当遇到开头一样,多个文件的时候,按两下,显示匹配信息供选择。
当遇到单个文件的时候,tab键,按一下,匹配命令和参数。
centos7可以补全参数。7以前不能、需要安装一个包,重启后生效:yum install -y bash-completion
别名
-
命令语法
alias [命令别名]=[具体命令] 设置别名、 -
命令描述
alias命令用来设置指令的别名 -
命令选项
-p:打印已经设置的命令别名。(可加可不加)
unalias 取消别名 -
显示所有别名
-
[[email protected] ~]# 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'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 给重启服务systemctl restart network.service 做别名
-
[[email protected] ~]# alias restartnet='systemctl restart network.service'
-
[[email protected] ~]# unalias restartnet //取消别名
- 1
- 2
- 3
- alias定义别名位置 .bashrc 和 /etc/profile.d/’下
-
[[email protected] ~]# vi .bashrc
-
[[email protected] ~]# cd /etc/profile.d/
-
[[email protected] profile.d]# ls
通配符
[*] : 表示任意个任意字符
-
[[email protected] ~]# ls *.txt #查询以任意开头的.txt文件
-
1.txt 2.txt 3.txt 4.txt test_windoiws_upload_file.txt
-
[[email protected] ~]# ls *txt* #查询以任意开头任意结束,包含txt的文件
-
1.txt 2.txt 3.txt 4.txt test_windoiws_upload_file.txt
[?] : 一个任意字符
-
[[email protected] ~]# ls ?.txt
-
1.txt 2.txt 3.txt 4.txt
[[0-9]、[a-z]] : []范围内
-
[[email protected] ~]# ls [0-9].txt
-
1.txt 2.txt 3.txt 4.txt
-
[[email protected] ~]# ls [0-3].txt
-
1.txt 2.txt 3.txt
-
[[email protected] ~]# ls [0-9a-z].txt
-
1.txt 2.txt 3.txt 4.txt
[{1,5}] : 表示匹配{}里面列出的,类似[15]效果
-
[[email protected] ~]# ls {1,2}.txt
-
1.txt 2.txt
-
[[email protected] ~]# ls {1,4}.txt
-
1.txt 4.txt
-
[[email protected] ~]# ls {1,2,3}.txt
-
1.txt 2.txt 3.txt
输入输出重定向
[>] : 表示输出将前者显示的内容输出写入到后面的文件中去(注意写入到后者的文件中原文件内容将被替换)
-
[[email protected] ~]# echo "122222" > 1.txt
-
[[email protected] ~]# cat !$
-
cat 1.txt
-
122222
[>>] : 表示追加,即将前者显示的内容追加到后者文件中去且不会替换掉原文件的内容
-
[[email protected] ~]# echo "this is append context" >> 1.txt
-
[[email protected] ~]# !cat
-
cat 1.txt
-
122222
-
this is append context
[2>] : 表示错误输出,即将前者执行的错误结果输出到后者文件中去
-
[[email protected] ~]# teacher
-
-bash: teacher: 未找到命令
-
[[email protected] ~]# teacher 2> 1.txt
-
[[email protected] ~]# cat !$
-
cat 1.txt
-
-bash: teacher: 未找到命令
[2>>] : 表示追加输出,即将前者执行的错误结果追加输出到后者文件中去
-
[[email protected] ~]# car 2>> 1.txt
-
[[email protected] ~]# !cat
-
cat 1.txt
-
-bash: teacher: 未找到命令
-
-bash: car: 未找到命令
[&>] : 结合了正确和错误输出的结果,写入到后者文件中
-
[[email protected] ~]# ls {1,2}.txt ww.txt &> 1.txt
-
[[email protected] ~]# cat 1.txt
-
ls: 无法访问ww.txt: 没有那个文件或目录
-
1.txt
-
2.txt
[&>>] : 结合了正确和错误输出的结果,追加到后者文件中
-
[[email protected] ~]# ls {1,2}.txt ww.txt &>> 1.txt
-
[[email protected] ~]# !cat
-
cat 1.txt
-
ls: 无法访问ww.txt: 没有那个文件或目录
-
1.txt
-
2.txt
-
ls: 无法访问ww.txt: 没有那个文件或目录
-
1.txt
-
2.txt
[>和2>] : 结合使用,指定正确执行的写入到正确文件去,错误的到错误文件中去
-
[[email protected] ~]# ls [123].txt car > 1.txt 2> 3.txt
-
[[email protected] ~]# cat 1.txt 3.txt
-
1.txt # 来自正确的输出1.txt
-
2.txt # 来自正确的输出1.txt
-
3.txt # 来自正确的输出1.txt
-
ls: 无法访问car: 没有那个文件或目录 # 来自错误的输出3.txt
[<] : 输入重定向,限制格式为: 命令 < 文件
-
[[email protected] ~]# wc -l 1.txt
-
3 1.txt
-
[[email protected] ~]# wc -l < 1.txt
-
3
管道符
管道符之前介绍过,它表示把一个文件的输出内容传递给后面的命令。举个例子,见下图,
关于管道符,有很多命令是可以用的,就是把前面命令输出的结果,交给后面的命令。后面会经常用到。
作业控制
之前说过一个快捷键,ctrl + z ,表示暂停一个任务。见下图,
输入命令 vim 1.txt ,回车,进入文件 1.txt 编辑。这时候想暂时退出来做其他事情的话,就可以使用 ctrl +z 命令来停止,这时候就可以退出来回到命令窗口,做其他的事情。那么 vim 这个命令其实还在后台,怎么再调出来呢?输入命令 fg ,回车,见下图,
又进入 vim 1.txt 这个页面里。fg 就是 front ground ,到前面来的意思。
后台的运行文件可以有多个,注意上图中的数字序号,命令 jobs 可以列出后台运行的任务信息。现在要把后台运行的任务调出来的话,命令 fg 后面就要加上 id 号,例如 fg 1 或是 fg 2 。若直接输入 fg 的话,默认是跳出最后执行的一个任务。
既然有 front ground ,也就有 back ground ,命令为 bg ,调到后台去。见下图,
将 vim a.txt 任务调到后台去,就变成上图红色框框的内容,相当于在后台运行。一般使用 vim 命令是达不到这种效果的,
现在运行命令 vmstat 1 ,这个命令后面会讲到,它会自带的显示系统的状态,而且是不停的显示。按住 ctrl + z ,就可以停止命令,然后输入 fg 命令,就可以把它调回来,接着按住 ctrl + z ,就可以停止命令,再输入 bg ,
就可以让它在后台运行,在运行的过程中,也可以运行其他命令,命令输入正确即可,即使被打断了也没有关系。见下图,
可以看到 vmstat 1 在运行中。接着见下图,
输入 fg ,可以进入 vim 1.txt ,进去之后,vmstat 1 还在一直运行,输入 :q! ,强制退出,然后输入 jobs ,可以看到,只有一个任务运行。
目前为止, vmstat 1 还在后台运行,把它调到前台,输入 fg 命令,回车,就进入前台执行命令。这时候,输入其他命令就不管用了。可以按住 ctrl + c ,直接结束命令。执行命令 jobs ,就可以看到没有任务了。
刚才说到一个观点,运行一条像 vmstat 1 这样的命令时,使用 bg 命令把它调到后台去,显示成运行中,还是会运行的。但是这边 vim 的命令是不算的,因为停止一条 vim 命令,不管是在前台还是后台,都是不会运行、停止的状态。
接着介绍一个命令 sleep ,sleep 1000 表示暂停1000秒,整个工作暂停运行,1000秒之后才会恢复。见下图,
bg 就是把一条命令调到后台去运行。还有一个命令,可以不用先运行命令,就能直接在后台运行,加一个 & ,见下图,
这边说一下 xshell ,如果另外打开一个终端,运行 jobs 命令,是看不到命令的。意思就是这个终端看不到另外一个终端后台运行的命令,但是可以看到进程,输入命令 ps aux |grep sleep ,回车,
关于 ps 命令,后面还会说到。
总结:
ctrl + z 暂停一个命令
fg 调出一个命令到前台
bg 将一个命令调到后台并运行
& 在一条命令后面加上这个符号,可以直接将命令调到后台运行
sleep +时间 暂停系统多少秒
vmstat 1 不停的显示系统状态命令
创建变量,引用变量:$
在Bash Shell 中,不必显式声明变量。可以在任何时间通过简单赋值来创建它们。创建变量语法:
<variable_name>=<value>
可以通过赋值运算符右边留空来创建没有值的变量。
声明变量时,赋值运算符(=)的两边都不能有空格。
$符号用来引用变量,$符号引用变量时,一般情况加变量名字可以不用加双引号:
Shell创建的变量一般被视为字符串。
注意上面变量var不是数字变量,而是字符串变量,var包含的是字符1和字符5组成的字符串,而不是数字15.
$变量名来引用变量的值,可以用大括号在界定变量名称,一般情况下{}可以省略。但是当涉及到连接操作时,{}不可以省略:
上面命令中,day变量值为20,如果变量x想要包含day变量值,并在值之后连接字符串th,则day变量在引用时,必须加{},否则就会把day当做普通字符串处理,不会认为是变量名。
将值读取到变量:read
read命令允许用户在执行shell脚本期间从键盘将值输入到变量。read命令可以用在shell提示符之后,但通常用在shell脚本中。
需要注意的是,执行read命令后,不会提示用户输入数据,只是进行光标闪烁。
如果要提示用户进行输入,我们必须自己使用echo命令。
上面脚本文件执行后效果:
本地和全局shell变量
在shell中创建的变量对于创建它的shell是本地变量,在shell中创建一个新shell。新shell不知道父shell的变量,新shell可以对父shell同名的变量赋新值,而父shell不会知道这一情况。bash命令可以创建新shell,从新shell退回,返回父shell使用exit命令。
有时候可能需要所有的子Shell了解父Shell的变量,所以需要把本地变量导出为全局变量。实现这一操作,可以使用export命令:
使用export命令导出变量后,子shell可以知晓父shell的变量,可以引用该变量,也可以给该变量赋新值。但是退出子shell,返回父shell显示后,父shell的该全局变量的值没有发生改变。也就是子shell修改父shell中创建的变量值,该修改只在子shell生效。
环境变量
导出的所有变量都是环境变量。
A、HOME变量
环境变量HOME用于存储用的主目录的位置:
B、PATH变量
PATH变量包含以冒号分隔的目录列表,Shell会通过它定位用户调用的命令。
设置路径时,用户不必转到可执行程序文件所在的目录,不管当前目录是什么,用户都可以执行程序。
不像MS-DOS,在Linux中不会自动搜索当前目录。只会搜索PATH中指定的目录。所以如果要搜索当前目录,必须在PATH中执行。可以通过在PATH中加入一点.(.表示当前目录)或提供一个空路径来指定当前目录:
a. PATH=/bin:/usr/bin: [以下列顺序搜索:/bin、/usr/bin、当前目录]
b. PATH=:/bin:/usr/bin [以下列顺序搜索:当前目录、/bin、/usr/bin]
c. PATH=/bin: :/usr/bin [以下列顺序搜索:/bin、当前目录、/usr/bin]
C、PS1变量
PS1(提示符变量)变量包含Shell提示符:默认为$符号。(Root用户的提示符为#,其他用户提示符为$)。我们可以通过该环境变量修改提示符:
PS1变量中还可以包含特定的预定义提示符字符串。例如:\w提示符字符串用于显示用户的当前工作目录;\u表示当前用户;\h表示主机名。
如果想要重新设置成默认提示符,root用户可以使用:PS1="[\[email protected]\h \W]# ",非root用户可以使用:PS1="[\[email protected]\h \W]# "
D、PS2变量
PS2变量用于设置次提示符的值的环境变量,默认情况为>。当在命令行提供了不完整的目命令时,会显示次提示符。
退出次提示符可以使用ctrl+c或Ctrl+d:
ctrl+c,会显示^C,然后退出;Ctrl+d会显示原因,然后退出
E、LOGNAME变量
LOGNAME变量包含用户的登录名:
F、SHLVL变量
SHLVL变量包含当前工作的Shell层
登录Shell,该变量值被赋为1.无论何时创建一个新的Shell,该变量的值都会加1.
G、SHELL变量
SHELL变量存储用户的默认Shell
env命令
env命令可以查看所有导出的环境变量及其各自值的列表: