目录
一、用户登录
1、root用户
2、普通(非特权)用户
二、终端terminal
1、终端类型
2、查看当前的终端设备
三、交互式接口
1、概念:启动终端后,在终端设备附加一个交互式应用程序
2、类型
3、什么是Shell
4、各种Shell
5、bash shell
四、执行命令
1、执行命令过程
2、Shell中可执行的2种命令
3、命令别名
4、命令格式
五、简单命令
1.1、更改主机名(临时修改)
1.2、更改主机名(永久修改)
2、命令提示符
3.1、查看硬件信息_CPU
3.2、查看硬件信息_内存大小
3.3、查看硬件信息_硬盘和分区情况
4.1、查看系统版本信息
4.2、查看操作系统发行版本
5.1、时间与修改
5.2、时区与修改
5.3日历
6、关机和重启
7、用户登录信息查看命令
8、文本编辑
9、会话管理
9.1screen
9.2tmux
10、输出信息echo
六、字符集和编码
1、ASCII码
2、Unicode
七、命令行扩展和被括起来的集合
1、反引号` ` 和 $() (相同功能)
2、括号拓展:{ }
八、tab键补全
作用:tab键可以实现命令和路径等的补全,提高输入效率,避免出错
1、命令补全
2、路径补全
3、双击tab键
九、命令行历史
过程:
命令历史相关环境变量:
持久保存变量:
调用命令行历史:
bash的快捷键:
一、用户登录
1、root用户
特殊的管理账户,也称为超级用户,已经具有接近完整的系统控制能力
对系统损害几乎具有无限的能力,非必要不登陆root
2、普通(非特权)用户
权限有限
造成损害的能力有限
二、终端terminal
1、终端类型
①控制台终端:/dev/console
②串行终端:/dev/ttyS#
③虚拟终端:tty:teletypewriters,/dev/tty#,tty可有n个,Ctrl+Alt+F#
④图形终端:startx,xwindows
CentOS 6:Ctrl+Alt+F7
CentOS 7:在哪个终端启动,即在哪个虚拟终端
⑤伪终端:pty:pseudo-tty,/dev/pts/# 如:SSH远程连接
⑥设备终端:键盘+鼠标+显示器
如Ubuntu登陆后,这就是一个终端,在以前称为物理终端
2、查看当前的终端设备
tty
tty命令可以查看当前所在终端
接下来我们测试我们的CentOS6、7、8(下面简称C6、C7、C8)以及Ubuntu(ubt)的终端
CentOS 6:
CentOS 7:
CentOS 8:
Ubuntu:
同时,我们查看一下我们机器的地址,使用hostname -I命令
hostname -I
C6:
C7:
C8:
Ubuntu:
即按照我们设置的网络地址从10.0.0.201-10.0.0.204的四台机子
这样以后就可以远程连接我们的服务器
①接下来我使用MobaXterm远程连接我的C8,网络地址为10.0.0.201
点击OK,输入密码后即可连接成功
我们在内部输入tty和hostname -I命令
②接下来我使用Xshell远程连接我的C8,网络地址为10.0.0.201
点击左上角的添加,然后输入名称和主机的地址
点击左侧的用户身份验证,输入用户名和密码,点击确定即可
同样的,我们输入tty和hostname-I命令
可见是pts/2
此时就相当于我们通过2个终端窗口连接到同一台电脑上,而两个终端互不影响
同时,如果我们想要查看有几个用户,即有几台终端连接,我们可以使用命令who
who
随便一个终端里输入后,可以看到
第一个是我在VMware里打开的C8(图形界面i),第二个pst/1是MobaXterm远程连接的C8,第三个pst/2是Xshell远程连接的C8(2个字符界面
同时,我们还可以使用free -h(单位为G)/free命令来查看系统所消耗内存数
C8:
Ubt:更少,因为基本属于最小安装没有图形
在上面基础上,我们还可以将图形模式关闭,即将图形模式转换成字符模式
先使用runlevel命令查看当前模式
runlevel
显示 N 5,即当前使用5模式,即图形模式,N代表上一次的模式(上次没有模式)
同时使用free -h查看系统所消耗内存数,大概1.0G
接下来,使用init 3命令来将模式改为字符模式
init 3
再次使用runlevel 查看模式与free -h查看内存数
显示5 3,即上次使用5模式(图形模式),当前是3模式(字符模式)
内存数从1.0G降到370M,缩减三分之二
三、交互式接口
1、概念:启动终端后,在终端设备附加一个交互式应用程序
2、类型
①GUI:Graphic User Interface图形终端
X protocol协议、window manager、desktop
Desktop分为:GNOME(C、图形库gtk)、KDE(C++、图形库qt)、XFCE(轻量级桌面)
②CLI:Command Line Interface命令行接口
Shell
3、什么是Shell
Shell(壳)是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行
Shell是一种高级程序设计语言,也被称为Linux的命令解释器,即将我们输入的英文字符转化成二进制供内核理解并执行操作
4、各种Shell
sh:Steve Bourne
bash:Bourne-Again Shell、GPL、CentOS、Ubuntu默认使用
csh:c Shell、C语言风格
tcsh
ksh:Korn Shell、AIX默认Shell
zsh:MacOS默认Shell
而我们可以使用echo $SHELL命令来查看我们当前是使用系统的Shell
echo $SHELL
C8:
Ubuntu:
同时,我们可以使用cat /etc/shells命令来查看系统支持的Shell类型
cat /etc/shells
Ubuntu:
C8:
同时我们知道,windows里有任务管理器
里面显示了我们后台运行的各种服务
而在Linux里,我们可以使用ps aux命令来查看系统后台运行的所有程序
ps aux
Ubt:
可以看到bash服务
C8:
5、bash shell
GNU Borune-Again Shell(bash)是GNU计划中重要的工具软件之一,目前也是Linux标准的Shell,与sh兼容
四、执行命令
1、执行命令过程
输入命令后回车,提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来
shell本身也是一个程序,(当用户登录时,它就自动加载到内存中运行)它集成了很多小的工具(即内部命令,加载到内存中)。放在bash里
因此不属于shell的就是外部命令,存放于磁盘上,运行时需要先去磁盘上找到外部命令
我们可以使用type命令来查看我们输入的命令是内部命令或外部命令
type +命令名
而上面这种显示出路径的是外部命令
而下面这种显示shell不显示路径的是内部命令
而有些是特殊的,比如ls显示的是别名
而不是随便一个文件夹都可以存放外部命令的,我们可以使用echo $PATH命令来查看存放外部命令的文件夹
echo $PATH
以:为间隔分出5个存放外部命令的文件夹
当我们输入一个命令,如果不是内部命令,则按照这个顺序依次寻找外部命令,找到则加载到内存中运行,否则报错
作为对比,内部命令直接就存放在内存中,因此优先执行,效率更高
因此,如果我们每次执行外部命令时系统都从磁盘里寻找,则效率很低
所以,Linux中有一个逻辑:记录上次运行的外部命令的路径到内存(即hash哈希),因此再次执行时不需要再去磁盘中寻找,直接去记录的路径寻找
同时,可以使用hash命令来查看执行过的外部命令的路径与执行次数
hash
再次执行外部命令时,上面次数会+1
同时,我们可以使用enable / help 来查看所有的内部命令
enable / help
注意第一个命令 . 点,功能同source命令,使我们写入的配置文件即刻生效
. / source
即我们修改字体颜色时,我们如果重新登陆/注销/重启 太麻烦,因此我们写上.或source +刚才修改文件的代码,就可以使系统重新读取文件内容使其生效
2、Shell中可执行的2种命令
①内部命令:由shell自带的,而且通过某命令形式提供
②外部命令:在文件系统路径下有对应的可执行程序文件
因为内部命令优先级高于外部命令,因此正常情况下,若有和内部命令同名的外部命令,则外部命令一般不会运行,因为找到内部命令就不再去磁盘寻找命令
echo就有同名的外部命令
我们可以使用type -a echo命令来查看echo同名的外部命令
type -a echo
当然,也不是说外部命令一定不会执行,方法之一是我们将内部命令禁用
使用enable -n echo命令即可禁用echo命令(临时禁用)
enable -n echo
禁用后,不仅type命令不显示内部命令,enable命令也不显示echo内部命令了
help命令里echo前带有个*号
同时,我们使用enable echo命令可以恢复echo这个内部命令
由于enable也是个内部命令,所以也可以被临时禁用
不过由于是临时禁用,我们注销后就恢复了
而对于外部命令,有which命令和whereis命令来查看外部命令的路径
which +外部命令
whereis +外部命令
如果是内部命令,which会显示没有
而whereis不仅会显示命令的文件路径,还会显示命令的帮助文件的路径
对于hash命令:
hash 显示hash缓存
hash -I 显示hash缓存,可作为输入使用
hash -p path name 将命令全路径path起别名为name
hash -t name 打印缓存中name的路径
hash -d name 清楚名为name的缓存
hash -r 清空缓存
3、命令别名
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行
我们可以使用alias命令来给某条命令或地址起别名
alias +命令/地址
如现在我们有这么个地址,我们要访问的话,要写很长的地址
接下来,我们把后面的地址/etc/sysconfig/network-scripts/起别名为cdnetwork
首先要确定cdnetwork是不是内部或外部命令
这样就实现了将那个地址命名为别名,以后就可以通过别名访问这个地址
如果我们强行把一个地址起别名与一个内部命令同名会怎么样?
如图,enable是内部命令,我们起别名后,再次使用内部命令则系统运行的是我们起的别名
这意味着,系统命令的优先级顺序是:
别名 > 内部命令 > 外部命令 > 找不到
同时,我们这样起的别名不是永久的,当我们注销后就恢复,因此,如果想永久生效,则需要修改文件
首先使用ls -a命令显示出各个用户下的文件(只ls不行,因为文件是隐藏的)
ls -a
别名的配置文件也就是这个 .bashrc文件
使用nano命令进入文本编辑
在这里就可以添加别名,并永久生效
我们使用./source使其生效
然后直接使用别名cdnetwork
已经永久生效
同时,我们可以使用alias命令查看所有的别名
alias
而如果想取消别名,可以使用unalias命令/unalias -a取消全部别名(都是临时)
unalias +别名
unalias -a
已经 取消
注意:
①对当前用户生效:~/.bashrc
②对所有用户生效:/etc/bashrc
③如果别名与原某个命令重名,而还想要运行原命令:
\别名
'别名'
"别名“
command 别名
/path/command (只适用于外部命令)
4、命令格式
各种命令的格式:
command [options...] [arguments...]
command:命令名称
options:选项 用于启用或关闭命令某个或某些功能
分为3种
①短选项:UNIX风格,如 -c、-l、-h等
ls -a
ls -l
②长选项:GNU风格,如 --word、--all、--human等
ls --all
③BSD风格:仅一个字母,如 a
ps a
argument:参数 命令的作用对象,如文件名、用户名等
有些命令支持①,有些支持②,有些支持③,有些支持①②,有些支持①②③
完整的一个命令如:查看root的uid
id -u root
注意:①多个选项以及多参数和命令之间使用空白字符分隔
如:
ls -a -l
ls -l -a
ls -la
ls -al
ls --all -l
作用效果完全相同,不过不是所有命令都支持前后顺序随意
②取消命,强行退出:Ctrl+C 终止命令,正常退出:Ctrl+D
③批量执行:多个命令用 ; 分号分开
④一个命令可以用\分成多行
不过一般只有很长的命令才这么干
五、简单命令
1.1、更改主机名(临时修改)
可以使用 hostname +主机名 来更改主机名
hostname +主机名
不过Ubt里正常我们使用的自己账户,没有root权限,没法更改主机名。
这里我们使用sudo -i命令来切换到root用户,并输入密码
sudo -i
这样就切换到了root权限的用户,我们再次使用hostname命令更改主机名,并使用hostname命令查看主机名
注意:这样修改的主机名不是永久生效(存储在内存中),当系统重启后就失效
我们可以使用reboot或者init 6命令来重启系统,init 0是关机命令
reboot
init 6
正在重启
再次使用hostname命令查看主机名
没有变化
1.2、更改主机名(永久修改)
可以使用 hostnamectl set-hostname +主机名 来更改主机名
hostnamectl set-hostname +主机名
重启后再次查看主机名
已经更改
注意:
①主机名不要用下划线_ 可以用-.
②默认情况下,root管理员权限后缀是 # 井号,而普通用户是 $ 符
同时,我们可以修改这个提示符
先使用echo $PS1命令来查看当前格式,再使用PS1=命令修改提示符
echo $PS1
PS1=
C8:
可见已经修改成NANA,不过这只是临时修改,原理同上面修改主机名
重启/重新登陆后恢复
因此,我们可以使用一些命令来修改我们的文字,以区分不同的系统
如在CentOS系列系统中使用:PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\]"
而命令的不同,显示的效果也有不同
不过,这样重启/注销后重新登录仍然会失效
因此我们写入到文件中
echo 'PS1="\[\e[1;38m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' > /etc/profile.d/env.sh
这样就永久修改颜色,并加上时间,重启也存在
2、命令提示符
这个界面就是命令提示符
Windows也有:不过显示的是文件夹
3.1、查看硬件信息_CPU
lscpu 或 cat /proc/cpuinfo 命令可以查看cpu信息
lscpu
cat /proc/cpuinfo (核心单个信息显示)
3.2、查看硬件信息_内存大小
cat /proc/meminfo 命令可以查看内存大小
cat /proc/meminfo
3.3、查看硬件信息_硬盘和分区情况
lsblk 命令可以查看硬盘
lsblk
而使用cat /proc/partitions命令可以查看分区情况
注意:proc/ 文件夹中的数据存在内存里,不存在硬盘上,因此我们使用ls -l命令查看硬盘上proc/meninfo或cpuinfo文件夹大小都会是0
4.1、查看系统版本信息
使用uname -r命令可以查看系统版本信息
uname -r
C6:2.6.32-754.el6.x86_64
C7:3.10.0-1160.71.1.el7.x86_64
C8:4.18.0-348.el8.x86_64
Ubt:4.15.0-212-generic
4.2、查看操作系统发行版本
对于我们的CentOS系列系统(红帽公司),可以使用cat /etc/redhat-release命令来查看系统发行版本
cat /etc/redhat-release
各个版本:
C6:CentOS release 6.10 (Final)
C7:CentOS Linux release 7.9.2009 (Core)
C8:CentOS Linux release 8.5.2111
而Ubt不是红帽公司的,因此不能用这个命令,而是使用cat /etc/os-release命令来查看,有些系统也可以使用,上面CentOS就可以(C6不行)
cat /etc/os-release
Ubt:
C8:
5.1、时间与修改
Linux有2种时间:
①系统时间:由Linux内核通过CPU的工作频率进行的
②硬件时间:主板上记录的时间
可以使用date命令来查看系统时间
date
使用clock或hwclock命令来查看硬件时间
clock
hwclock
当然,我们可以修改时间,使用 date +月日小时分年.秒 的格式修改时间
date +月日小时分年.秒
不过由于是保存在内存里的系统时间,重启后时间会恢复,而硬件时间不会
同时,这里有2个命令:
①clock -s 或 clock -hctosys :以硬件时间为准,校正系统时间
②clock -w 或 clock -systohc:以系统时间为准,校正硬件时间
5.2、时区与修改
使用ll /etc/localtime命令来查看当前时区
ll /etc/localtime
可以查看就可以修改时区
使用timedatectl list-timezones命令来查看所有的时区
然后使用timedatectl set-timezone +时区名 命令修改时区(支持C7及以上)
再使用date 与 ll /etc/localtime命令来查看时区
已经修改
如果想改回,可以直接使用timedatectl set-timezone +时区名 命令修改时区
5.3日历
cal 显示当月日历
cal -y 显示当年月历
cal ye 显示ye年的时间
cal mon ye 显示ye年mon月的日历
6、关机和重启
关机命令:
halt
poweroff
重启命令:
reboot
-f 强制关机,不调用shutdown
-p 切断电源
关机或重启:
shutdown [OPTION]... [TIME] [MESSAGE]
OPTION/选项:
① -r:reboot
② -h:halt
③ -c:cancel
TIME/时间:
①无指定,默认相当于+1(C7)
②now:立刻,相当于+0
③+#:相对时间表示法,几分钟后,如+3
④hh:mm:绝对是就表示法,指明一个具体的关闭的时间
测试:
十分钟后关机
22:30关机
7、用户登录信息查看命令
whoami 显示当前登录有效用户
who 系统当前所有的登录
w 系统当前所有的用户登录及其所进行的操作
测试:
8、文本编辑
目前先认识这两个
nano 可以实现文本的编辑
gedit 图形工具
9、会话管理
命令行的典型使用方式:打开一个终端窗口,在里面输入命令,这样用户与计算机开始交互,这称为一次会话(session)
会话有一个重要特点:窗口与其启动的进程连接,打开窗口,会话开始;关闭窗口,会话结束,里面的程序也会终止。
而我们使用终端复用器就可以将会话与窗口彻底分离,使窗口关闭时,会话仍在运行,可以进行下一次连接
9.1screen
使用dnf/yum -y install screen命令可以安装screen
dnf/yum -y install screen
打开screen
我输入yes,他会一直输出y下去
关闭窗口
打开新的窗口查看
我们使用w命令是看不到的
我们使用ps aux命令查看后台运行的所有程序
仍在运行 ,这就实现了终端关闭但程序并不结束
同时,使用screen可以实现远程协助:
首先2台设备要连接同一个终端
然后在需要被连接的一方输入screen -S [name];name可以随便定义
回车后进入
这时我们在其他设备输入screen -ls命令即可查看所有的screens
然后在另一台设备输入screen -x [name];与上面相同的name
然后2台设备就实现了同步
如果要主动退出远程协助,可以先同时按Ctrl+a,再按d键
这样就退出了,不过此时,被帮助一方仍在screen里,仍然可以被其他人加入
因此,如果被帮助一方不再需要帮助,可以主动退出,输入exit退出screen
screen常用命令:
screen -S [NAME] 创建新screen会话
screen -x [NAME] 加入screen会话
exit 退出并关闭screen会话
Ctrl+a,d 退出当前screen会话
screen -ls 显示所有已打开的screen会话
screen -r [NAME] 恢复某screen会话
9.2tmux
类似于screen,但更强,功能更多
功能:
①允许在单个窗口中,同时访问多个会话。便于同时运行多个命令行程序
②可以使新窗口连接上已经存在的会话
③允许每个会话有多个连接窗口,因此可以多人实时共享会话
④支持窗口任意的垂直和水平拆分
常用命令 :
tmux 启动tmux
exit 退出tmux
tmux new -s [NAME] 新建名为NAME的会话
tmux new-window 创建新窗口
tmux new-window -n [NAME] 新建名为NAME的窗口
tmux ls/list-session 查看当前所有的tmux会话
tmux detach 或 ctrl b,d 将当前会话与窗口分离
tmux attach -t [NAME] 接入某个已存在的会话
tmux kill-session -t [NAME] 结束某个会话
tmux switch 切换会话
tmux split-window 或 ctrl b," 将窗口上下分开
tmux split-window -h 或 ctrl b,% 将窗口左右分开
tmux select-window -t [NUMBER] 切换到指定编号的窗口
tmux select-window -t [NAME] 切换到指定名称的窗口
tmux list-keys 显示所有的快捷键,及其对应的Tmux命令
tmux list-commands 列出所有的Tmux命令及其参数
同时,窗口有很多快捷键
Ctrl b,% 划分左右两个窗格
Ctrl b," 划分上下两个窗格
Ctrl b,方向键上下左右 光标移动到其他窗格
Ctrl b,; 光标切换到上一个窗格
Ctrl b,o 光标切换到下一个窗格
Ctrl b,{ 当前窗格左移
Ctrl b,} 当前窗格右移
Ctrl b,Ctrl o 当前窗格上移
Ctrl b,Alt o 当前窗格下移
Ctrl b,x 关闭当前窗格
Ctrl b,! 将当前窗格拆分为一个独立窗口
Ctrl b,z 当前窗格全屏展示,再按一次回到原大小
Ctrl b,Ctrl 方向键上下左右 按箭头方向调整窗格大小
Ctrl b,q 显示窗格编号
Ctrl b,c 创建一个新窗口,状态栏上会显示多个窗口的信息
Ctrl b,p 切换到上一个窗口
Ctrl b,n 切换到下一个窗口
Ctrl b,w 从列表选择窗口
Ctrl b,编号 切换到指定编号的窗口
Ctrl b,, 窗口重命名
10、输出信息echo
功能:显示字符,echo会将输入的字符串送往标准输出。输出的字符串之间以空白字符隔开,并在最后加上换行符
echo -[OPTIONS][string]
OPTIONS:
① -E:默认,不支持\解释功能
② -n:不自动换行
③ -e:启用\字符解释功能,即下面的\命令
显示变量:$表示后面的是变量名
echo "$VAR_NAME" // 用变量值替换,弱引用
echo '$VAR_NAME' // 变量不会替换,强引用
单引号强引用,将所有在其中的字符作为字符串输出
双引号弱引用,可以识别里面的变量:将$HOSTNAME识别为变量输出
而单引号是直接作为字符串输出
-e 启用命令选项,若字符串出现以下命令,则特别加以处理,不会将其当成一般文字输出
\a 发出警告声音
\b 退格键
\c 最后不加上换行符
\e escape 相当于\033
\n 换行且光标移至行首
\r 回车,即光标移至行首,但不换行
\t 插入tab
\ 转义字符
\0nnn 插入nnn(八进制)所代表的ASCII字符
\xHH 插入HH(十六进制)所代表的ASCII码数字(man 7 ascii)
如echo -e "\a" 即可使计算机发出警告声,当我们执行较长时间命令即可加上,使任务完成时发出警告声提示
echo -e '\0XXX' 可以输出八进制代表的字符(八进制0123转换成字符是S,0130是X)
echo -e '\xXX' 可以输出十六进制代表的字符(十六进制x67转换成字符是g,x57是W)
对于 \转义字符,可以使特殊符号原有的功能改变
如: echo $PATH本身可以输出PATH的目录,但加上\后,将$PATH视为一个普通字符串输出
又如:我们要输出\,使用\\,第一个转义功能,第二个是被转义的
或\\\\,第一第三个转义功能,第二第四被转义输出
六、字符集和编码
许多场合下,字符集和编码这2个概念被混为一谈,但二者有很大区别。
字符集:character set,简称charset,即二进制和字符的对应关系,不关注最终的存储形式
字符集编码/编码:charset encoding,简称encoding,实现如何将字符转化为实际的二进制进行存储或相反,决定了空间的使用大小
1、ASCII码
在计算机内部,所有信息最终都是一个二进制值。
ASCII:American Standard Code for Information Interchange
一共规定128个字符的编码,占用了一个字节的后面7位,最前面一位统一规定为0
2、Unicode
ASCII只为处理127个字母,但处理中文显然不够,至少需要2个字节,因此,中国制定了GB2312编码,用来将中文编写进去
日本将日文编进Shift_JIS,韩国将韩文编进Euc-kr,各国有不同的标准,使用将会有问题
Unicode:万国码,一个很大的字符集合,规定了每个字符对应的二进制代码
七、命令行扩展和被括起来的集合
1、反引号` ` 和 $() (相同功能)
· command· 执行其中命令
$(command)
反引号可以使它其中的命令运行
如:命令hostname,使其执行
又如:" "双引号里命令不会执行,只看变量。而' '单引号就直接输出
只有` `反引号可以执行其中的命令
同时$()也有相同作用
总结:
①单引号:变量和命令都不识别,全部作为普通字符串输出
②反向单引号:变量和命令都识别,将其中的内容当作命令执行后,再交给调用反向单引号的命令继续执行
③双引号:不能识别命令,可以识别变量
功能展示:
①date +%F命令可以显示出当前日期
date +%F
我们在创建一个名为日期的文件时,可以直接使用反向单引号`date +%F`来创建一个日期为今天的文件,就不用再手动查看日期再把日期命名
可以使用nano或touch命令来创建文件
②还可以在日期前加上`hostname`来使文件前带上我们主机名
③echo可以查看文件
ll加上文件名可以查看具体信息
那我们想直接ll echo出的文件呢?
就可以用到反向单引号的功能:ll `echo `date +%F`.txt`
这个命令是命令嵌套命令
无法运行,因为有4个单引号,系统不知道哪两个结合
因此,``的缺点就在于这里:不能嵌套命令
但是$()可以
同时还可以``和$()同时使用
2、括号拓展:{ }
{ }可以实现打印重复字符串的简化形式
输入命令 结果
echo {1,3,5} 1 3 5
echo 1 3 5 1 3 5
echo babe{1,3,5} babe1 babe3 babe5
echo babe{1,3,5}.text babe1.text babe3.text babe5.text
echo babe{1..8} babe1 babe2 babe3 babe4 babe5 babe6 babe7 babe8
echo babe{3..8} babe3 babe4 babe5 babe6 babe7 babe8
echo babe{12..8} babe12 babe11 babe10 babe9 babe8
echo babe{12..8..2} babe12 babe10 babe8
echo babe{3..8..2} babe3 babe5 babe7
echo {a..f} a b c d e f
echo {a..f..2} a c e
echo {000..8} 000 001 002 003 004 005 006 007 008
echo {000..8..2} 000 002 004 006 008
有些特殊的
echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z
echo {a..Z} a ` _ ^ ] [ Z
echo {A..z} A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
echo {Z..a} Z [ ] ^ _ ` a
echo {a..A} a ` _ ^ ] [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
echo {z..A} z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
笛卡尔乘积:
echo bave{1..5}.{txt,log} bave1.txt bave1.log bave2.txt bave2.log bave3.txt bave3.log bave4.txt bave4.log bave5.txt bave5.log
八、tab键补全
作用:tab键可以实现命令和路径等的补全,提高输入效率,避免出错
1、命令补全
- 内部命令
- 外部命令
- 命令的子命令补全
注意:如果用户给定的字符串只有唯一对应的命令,则按下tab直接补全,否则再次按tab给出命令列表
2、路径补全
原理同上,如果用户给定的字符串只有唯一对应的路径,则按下tab直接补全,否则再次按tab给出列表
3、双击tab键
command 按2次tab 显示所有子命令或命令补全
string 按2次tab 以string开头命令
/ 按2次tab 显示所有根目录下一级目录,包括隐藏目录
./ 按2次tab 显示当前目录下子目录,包括隐藏目录
* 按2次tab 显示当前目录下子目录,不包括隐藏目录
~ 按2次tab 所有用户列表
$ 按2次tab 所有变量列表
@ 按2次tab /etc/hosts记录 (centos7不支持)
= 按2次tab 相当于ls -A (centos7不支持)
九、命令行历史
过程:
-
执行命令后,系统默认会在内存中记录执行过的命令
-
当用户正常退出后,系统会将内存的命令历史存放到对应历史文件中,默认是 ~/.bash_history
-
当用户登录shell,系统会自动读取命令历史文件下记录的命令加载到内存中
-
登陆进shell后,新执行的命令会记录在内存的缓冲区中,这些命令会在用户正常退出时存放进历史文件中
作用:可以用它重复执行命令,提高效率
命令:
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
参数:
-c 清空命令历史
-d offset 删除历史中指定的第offset个命令
n 显示最近的n条记录
-a 追加本次会话新执行的命令历史列表至历史文件中
-r 读历史文件附加到历史列表
-w 保存历史列表到指定历史文件中
-n 读历史文件中未读过的行到历史列表
-p 展开历史参数成多行,但不存在历史列表中
-s 展开历史参数成一行,附加在历史列表后
命令历史相关环境变量:
HISTSIZE 命令历史纪录的条数
HISTFILE 指定历史文件,默认为 ~/.bash_history
HISTFILESIZE 命令历史文件记录历史的条数
HISTTIMEFORMAT="%F %T `whoami` " 记录显示用户和时间
HISTGNORE="str1:str2*..." 忽略str1命令、str2开头的命令
HISTCONTROL 控制命令历史的记录方法
ignoredups 默认值,可忽略重复的命令,连续且相同为重复
ignorespace 忽略所有的以空白开头的命令
ignoreboth 相当于前两个命令的组合
erasedups 删除重复命令
持久保存变量:
以上变量可以以 export 变量名="值" 的形式存放在 /etc/profile 或 ~/.bash_profile
export 变量名="值"
调用命令行历史:
重复上一个命令:
使用上方向键 并回车执行
按!! 并回车执行
输入!-1 并回车执行
按ctrl+p 并 回车执行
!:0 执行前一条命令(去除参数)
!n 执行history命令输出对应序号n的命令
!-n 执行history历史中倒数第n个命令
!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,而不执行
!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
使用up(向上) 和down (向下) 键来上下浏览从前输入的命令
ctr1-r 在命令历史中搜索命令
(reverse-i-search)`':
ctr1+g 从历史搜索模式退出
要重新调用前一个命令中最后一个参数:
!$ 表示最后一个参数
ESC . 点击esc松开,再按 . 键
Alt . 按住alt然后按 . 键,不松开alt
command !^ 利用上一个命令的第一个参数做command的参数
command !$ 利用上一个命令的最后一个参数做command的参数
command !* 利用上一个命令的全部参数做command的参数
command !:n 利用上一个命令的第n个参数做command的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数
bash的快捷键:
Ctrl + L 清屏,相当于clear命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出,解锁
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 按下输入指定字符后,重复显示该字符#次