杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

Linux基础

Linux的使用和常用命令,主要是在 CentOS 8 上试验

快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#历史命令翻找
ctrl+P 向前翻命令
ctrl+N 向后翻命令

#光标移动
ctrl+B 光标左移
ctrl+F 光标后移
ctrl+A 光标移至行首
ctrl+E 光标移至行尾

#删除
ctrl+H 等价 backspace
ctrl+D 等价 Del
ctrl+U 删除光标前面的所有

#清屏
ctrl+L

部分基础命令

linux是大小写敏感,千万要注意

linux特殊文件名可以使用\进行转义,

如果是有 - 的文件如-a test,操作可以使用 rm -- '-a test'

1
2
3
4
5
6
7
8
9
10
11
12
13
init 0		关机
init 1 单用户
init 2 多用户
init 5 图形界面
init 3 字符界面
init 6 重启

clear 清屏
logout 注销

whereis
whatis
which

常用工具

lrzsz tree screen tmux strace

1
2
3
4
5
6
7
8
9
10
11
bc    # 计算器, ctrl+d 退出
[root@CentOS8 ~]#bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2^3 # 计算2的3次方
8
obase=2 # 将192按二进制输出
192
11000000
1
ping www.baidu.com  测试网络是否连接, ctrl+c 停止
1
2
3
ctrl alt F1		图形
ctrl alt f2 字符1
ctrl alt f3 字符2
1
2
3
4
5
yum -y install name			# 下载name
yum -y install nano # 下载nano编辑器

yum remove name # 删除name
yum remove gcc # 删除gcc编译器
1
2
3
hostname     完整主机名
sudo -i 切换root用户
passwd 设置root用户密码
1
2
free -h		查看内存 ,-h的作用是把内存以合适的单位显示,而不全是字节
uname -r 查看linux内核版本
1
runlevel    # 查看运行级别

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

1
history		查看输入过命令
1
2
3
4
5
6
whoami		# 查看自己身份
who am i # 查看系统登录者的信息:名称、终端、时间
who # 查看系统的所有登录者
w # 查看所有登录用户信息,以及正在进行的操作

tty # 查看当前终端
1
2
3
ps					显示系统当前的进程
echo ${SHELL} 显示当前系统使用的shell
cat /etc/shells 系统支持的shell类型

多个命令可以用 “;” 符号分开,如:ls;who

一个命令可以用 \ 分成多行,如:

1
2
3
4
5
[root@yanglinqi ~]# ls \
> -l
总用量 8
-rw-------. 1 root root 1614 1月 25 00:28 anaconda-ks.cfg
-rw-r--r--. 1 root root 1905 1月 25 12:21 initial-setup-ks.cfg

远程连接

推荐软件,Xmanager Power Suite,这是一套软件,包含xShell等

字符界面

1
2
3
4
5
6
7
8
hostname -I   查看ip地址

在windows系统终端以下命令可以远程连接
ssh 登录的用户@上面查看到的ip地址
例:ssh root@192.168.79.128

windows远程连接的工具
xShell 或 MobaXterm

使用图像化工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 第一步,运行Xmanager Power Suite 的 Xmanager.exe
在安装Xmanager Power Suite后,桌面出现Xmanager Power Suite的文件夹,里面有Tools文件夹,Tools文件夹里面有Xmanager.exe的快捷方式 Xmanager - Passive,运行Xmanager - Passive,注意:不是Xmanager这个快捷方式,名字不同
运行之后桌面右下角会有图标,鼠标移上去出现 Xmanager Server:0.0

# 第二步,查看本机的ip
在windows的cmd窗口,输入 ipconfig,出现多个ip
选择无线局域网适配器 WLAN 的 IPv4 地址:我的是 192.168.0.108

# 第三步
在xShell的会话界面输入:export DISPLAY=192.168.0.108:0.0 ip换成自己的ip

# 在xShell运行图像化工具
如:firefox gedit

注:如果出现下面情况
Unable to init server: 无法连接:拒绝连接

(gedit:3216): Gtk-WARNING **: 21:40:47.754: cannot open display: 192.168.0.108:0.0

在第三步试一试ipconfig查到的其他几个ip

# MobaXterm
如果使用的远程控制工具是MobaXterm,需要在Centos或Ubuntu安装文件
yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1

查看硬件信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看cpu信息
lscpu
cat /proc/cpuinfo

# 查看内存大小
free
cat /proc/meminfo

# 查看硬盘和分区
lsblk
cat /proc/partitions

# 查看内核版本
uname -r

# 查看操作系统发行版本
cat /etc/redhat-release
cat /etc/os-release
lsb_release -a
# ubuntu
cat /etc/os-release
cat /etc/is
cat /etc/issue

日期和时间

Linux的两种时钟

  • 系统时钟:由Linux内核通过CPU的工作频率进行的
  • 硬件时钟:主板

相关命令

  • date 显示和设置系统时间

    1
    2
    3
    4
    5
    6
    date # 显示系统时间
    date -s '1 year' # 修改时间至1年后
    date +%s # 1643271071 # 以秒显示时间,以1970.1.1 00:00:00开始经过的秒数,1970年为Unix元年
    date +%F # 2022-01-27
    date +%T # 16:14:59
    date -d @1643271071 # 显示从起始时间计算1643271071秒后的时间 # 2022年 01月 27日 星期四 16:11:11 CST
  • clock , hwclock 显示硬件时间

    1
    2
    3
    4
    5
    6
    -s ,  --hctosys    # 以硬件时钟为准,校正系统时钟
    -w , --systohc # 以系统时钟为准,校正硬件时钟

    # clock 和 hwclock 是同一个命令
    [root@yanglinqi ~]# ll /usr/sbin/clock
    lrwxrwxrwx. 1 root root 7 7月 21 2021 /usr/sbin/clock -> hwclock

时区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CST 	# 东八区,北京时间
UST # 格林威治时间
CST - UST = 8 hours # 差8小时
date -u #2022年 01月 27日 星期四 08:19:36 UTC

[root@yanglinqi ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 1月 25 12:21 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

# 查看时区
timedatectl list-timezones # 按空格键翻页,按q停止
# 修改时区为 纽约时间 EST
[root@yanglinqi ~]# timedatectl set-timezone America/New_York

# Ubuntu
cat /etc/timezone

显示日历:

1
2
3
4
cal    		# 显示当月
cal -y # 显示全年
cal 2022 # 显示2022年日历
cal 9 1752 # 显示1752年9月

关机和重启

关机:

  • halt
  • poweroff

重启:

  • reboot
    • -f :强制,不调用 shutdown
    • -p :切断电源

关机或重启:shutdown

1
2
3
4
5
6
7
8
9
10
11
12
13
shutdown [OPTION]... [TIME] [MESSAGE]

-r reboot
-h halt
-c cancel
TIME: 默认为+1
now 立刻,相当于+0
+# 相对时间表示法,几分钟后,如+3
hh:mm 绝对时间表示,指明具体时间

示例
shutdown -h +3
shutdown -h 17:00

设置主机名

1
2
3
4
5
6
7
#临时生效
hostname NAME

#持久生效
hostnamectl set-hostname NAME

#主机名不支持使用下划线,但支持横线,可使用字母、横线、数字的组合

提示符

  • 显示提示符格式:

    1
    2
    echo $PS1
    # [\u@\h \W]\$
  • 修改提示符格式范例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    PS1='\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]'
    PS1='\[\e[1;41;33m\][\u@\h \W]\\$\[\e[0m\]'
    PS1='\[\e[41;33m\][\u@\h \W]\\$\[\e[0m\]'
    PS1='\[\e[33m\][\u@\h \W]\\$\[\e[0m\]'
    PS1='\[\e[35m\][\u@\h \W]\\$\[\e[0m\]'
    # 31-37字体颜色,41-47背景颜色
    # \$ 是 $ \\$ 是 #

    PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"
  • 提示符格式说明:

    • \e 控制符\033
    • \u 当前用户
    • \h 主机名简称
    • \H 主机名
    • \w 当前工作目录
    • \W 当前工作目录基名
    • \t 24小时时间格式
    • \T 12小时时间格式
    • ! 命令历史数
    • # 开机后命令历史数
  • 在CentOS系统实现持久化保存命令提示符

    1
    2
    3
    echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' > /etc/profile.d/env.sh

    . /etc/profile.d/env.sh # 执行sh脚本

命令分类

  • 内部命令:由shell自带,而且通过某种命令形式提供 man builtin
  • 外部命令:在文件系统路径下有对应的可执行程序文件

命令执行过程

  • 在内部命令中找
  • 外部命令
    • hash表中查找
      • hash表中没有命令信息,继续
      • hash有命令信息,但命令的磁盘路径人为改变,报错
    • $PATH 中的路径中查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ll /bin/bash -h   # 集成在bash文件中的命令为内部命令
# 查看内部命令
enable # 所有启用的内部命令
help # 所有内部命令,禁用的命令前面带有*号

ls /bin # bin文件夹下的其他命令为外部命令,在磁盘文件中

# 判断命令是内部命令还是外部命令
type 命令名
#例
type help # help is a shell builtin
type hostname # hostname is hashed (/usr/bin/hostname)

# shell会先在内部命令bash中查找命令,没有再在文件中查找命令,若没有找到,则报错
echo $PATH # 查找的路径
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 即是内部也是外部命令,优先执行内部命令,备用的效果
type -a echo
# echo is a shell builtin
# echo is /usr/bin/echo

# 禁用内部命令,临时生效
enable -n echo # help查看内部命令,echo带有*号
enable -n # 查看禁用的内部命令
enable echo # 启用命令

# hash缓存表,用于保存外部命令的路径,提高效率
# 例,先输入几个命令 hostname 、 who
hash # 查看hash表,输出如下
# hits command
# 1 /usr/bin/hostname
# 1 /usr/bin/who
hash -d hostname # 删除hash表中保存的hostname命令路径

hash命令常见用法

  • hash 显示hash缓存
  • hash -l 显示hash缓存,可作为输入使用
  • hash -p path name 将命令全路径path起别名为name
  • hash -t name 打印缓存中name的路径
  • hash -d name 清楚name缓存
  • hash -r 清除缓存

命令别名

  • alias
  • alias name='value' 定义别名
  • unalias name 取消别名
  • unalias -a 取消所有别名

永久有效,要定义在配置文件中

  • 对当前用户永久有效: ~/.bashrc
  • 对所有用户永久有效:/etc/bashrc

如果别名同原命令同名,要执行原命令,使用

  • \aliasname
  • "aliasname"
  • 'aliasname'
  • command aliasname
  • /path/command # 只适用于外部命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 例如,要执行下面三条命令,很长,设为别名scandisk,三条命令的作用:查看新添加的硬盘
echo - - - > /sys/class/scsi_host/host0/scan
echo - - - > /sys/class/scsi_host/host1/scan
echo - - - > /sys/class/scsi_host/host2/scan

# 定义别名,临时生效
alias scandisk="echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan"

# 查看别名
alias scandisk

# 删除别名
unalias scandisk

# 写入 .bashrc文件,持久生效
# 可以直接在打开文件写入
# 也可以使用下面的命令,示例
echo "alias yi='yum -y install '" >> .bashrc
# 再运行 .bashrc 文件
. .bashrc
alias # 查看yi是否生效,可以直接使用yi下载了,如 yi gcc 下载gcc编译器

命令格式

1
2
COMMAND [OPTIONS...] [ARGUMENTS...]
COMMAND [COMMAND] [COMMAND] ...

选项:用于启用或关闭命令的某个或某些功能

  • 短选项:UNIX风格选项, -c 例如: -l, -h
  • 长选项:GNU风格选项,—word 例如: —all, —human
  • BSD风格选项:一个字母,例如:a,使用相对较少

参数:命令的作用对象,比如:文件名,用户名等

范例:

1
2
3
4
5
6
7
8
9
10
[root@CentOS8 ~]#id -u yang
1000

[root@CentOS8 ~]#ls -a
[root@CentOS8 ~]#ls --all

[root@CentOS8 ~]#free -h
[root@CentOS8 ~]#free --huamn

[root@CentOS8 ~]#ps a

文本编辑器

  • nano 实现文本的编辑,上手容易,适合初学者
  • gedit 图形化界面编辑器
  • vi 命令较多

会话管理

命令行的典型使用方式是,打开个终端窗口( terminal window,以下简称”窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”( session)
会话的个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完
一个典型的例子就是,SSH登录远程计算机,打开个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次SSH会话已经终止了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口

终端复用器软件就是会话与窗口的”解绑”工具,将它们彻底分离。
(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用
(2)它可以让新窗口”接入”已经存在的会话。
(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
(4)它还支持窗口任意的垂直和水平拆分
类似的终端复用器还有 Screen,Tmux

screen

1
2
3
4
5
6
7
8
# 安装 screen
# CentOS7
yum -y install screen
# CentOS8
dnf -y install epel-release
dnf -y install screen
#Ubuntu
apt install screen

screen命令常见用法:

  • 创建新screen会话

    screen -S [SESSION]

  • 加入screen会话

    screen -x [SESSION]

  • 退出并关闭screen会话

    exit

  • 剥离当前screen会话

    Ctrl+a,d

  • 显示所有已经打开的screen会话

    screen -ls

  • 恢复某screen会话

    screen -r [SESSION]

Tmux

是一个终端复用器 (terminal multiplexer),类似 screen,但是更易用,也更强大

Tmux就是会话与窗口的”解绑”工具,将它们彻底分离,功能如下

  • 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
  • 它可以让新窗口接入”已经存在的会话。
  • 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
  • 它还支持窗口任意的垂直和水平拆分

安装

1
yum install tmux

启动与退出

1
2
tmux
exit

Tmux窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是ctrl+b,即先按下ctrl+b,快捷键才会生效。帮助命令的快捷键是ctrl+b ?然后,按下q键,就可以退出帮助

新建会话
第一个启动的Tmux窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是0号会话、1号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。下面命令新建一个指定名称的会话。

1
tmux new -s <session-name>

tmux Is 或 Ctrl+b,s可以查看当前所有的Tmux会话

1
2
tmux ls
tmux list-session

分离会话
在Tmux窗口中,按下Ctrl+b d或者输入 tmux detach命令,就会将当前会话与窗口分离

1
tmux detach

接入会话
tmux attach 命令用于重新接入某个已存在的会话。

1
tmux attach -t <session-name>

范例:

1
tmux attach -t 0

杀死会话
tmux kill-session 命令用于杀死某个会话

1
x kill-session -t <session-name>

切换会话
tmux switch 命令用于切换会话

1
tmux switch -t <session-name>

可以将窗口分成多个窗格(pane),每个窗格运行不同的命令

上下分窗格

1
2
tmux split-window
ctrl+b,"

左右分窗格

1
2
tmux split-window -h
ctrl+b,%

窗格快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ctr1+b %   	划分左右两个商格
ctr1+b " 划分上下两个窗格
ctrl+b <arrow key> 光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按向下的方向键
ctr1+b ; 光标切换到上一个窗格
ctr1+b o 光标切换到下一个窗格。
ctr1+b { 当前窗格左移
ctr1+b } 当前窗格右移
ctr1+b Ctrl+o 当前窗格上移
ctr1+b A1t+o 当前窗格下移
ctr1+b x 关闭当前窗格
ctr1+b ! 将当前窗格折分为一个独立窗口
ctr1+b z 当前窗格全屏显示,再使用一次会变回原来大小
ctr1+b ctr1+<arrow key> 按箭头方向调整窗格大小
Ctr1+b q 显示窗格编号

列出所有Tmux命令及其参数

1
tmux list-commands

输出信息 echo

echo基本用法

echo命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号

语法:

1
echo [-neE][字符串]

选项:

  • -E(默认)不支持 \ 解释功能
  • -n 不自动换行
  • -e 启用 \ 字符的解释功能

显示变量

1
2
echo "$VAR_NAME”   # 用变量值换,弱引用
echo '$VAR_NAME' # 变量不会替换,强引用

启用命令选项 -e,若字符串中出现以下字符,则特別加以处理,而不会将它当成一般文字输出

  • \a 发出警告声
  • \b 退格键
  • \c 最后不加上换行符号
  • \e escape,相当于\033
  • \n 换行且光标移至行首
  • \r 回车,即光标移至行首,但不换行
  • \t 插入tab
  • \\ \ 插入 \ 字符
  • \0nnn 插入nnn (八进制)所代表的ASCII字符
  • \xHH 插入HH(十六进制)所代表的ASCII字符(man 7 ascii)

echo高级用法

在终端中,ANSI 定义了用于屏幕显示的 Escape.屏幕控制码

具有颜色的字符,其格式如下:

1
"033[字符背景色;字体色m字符串\033[0m"

\033[30m … \033[37m 设置前景色
\033[40m … \033[47m 设置背景色

1
2
3
4
5
6
7
8
9
10
11
# 字符背景色苑围:40-47
40:黑
41:红
42:绿
43:黄
44:蓝
45:紫
46:深绿
47:白色

# 字体颜色:30-37 和字符背景颜色对应

加颜色只是以下控制码中的一种,下面是常见的一些 ANSI 控制码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\033[0m		关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n列
\033[nD 光标左移n列
\033[x;yH 设置光标位置x行y列
\033[2J 清屏
\033[K 清除从光标到行尾的内客
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶

范例:显示文件的十六进制编码

1
2
3
4
5
6
7
8
9
10
[root@yanglinqi ~]# cat > myfile
A
B
C
D
[root@yanglinqi ~]# hexdump -C myfile
00000000 41 0a 42 0a 43 0a 44 0a |A.B.C.D.|
00000008
[yang@yang ~]$ hexdump -v -e '16/1 "%02x"' encrypt.key
feeec10f453de8bc1613eb416d4fbd99[yang@yang ~]$

字符集和编码

许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差別的。字符集与字符集编码是两个不同层面的概念。

charset是 character set的简写,即字符集,即二进制和字符的对应关系,不关注最终的存储形式

encoding是 charset encoding的简写,即字符集编码,简称编码,实现如何将字符转化为实际的二进制进行存储或相反,编码决定了空间的使用的大小

UTF-8是目前互联网上使用最广泛的一种 Unicode编码方式,可变长存储。使用1-4个字节表示一个字符,根据字符的不同变换长度,编码规则如下:

对于单个字节的字符,第一位设为0,后面的7位对应这个字符的 Unicode码。因此,对于英文中的0-127号字符,与ASCI码完全相同。这意味着ASC码的文档可用UTF-8编码打开
对于需要使用N个字节来表示的字符(N>1),第一个字节的前N位都设为1,第N+1位设为0,剩余的N-1个字节的前两位都设为10,剩下的二进制位则使用这个字符的 Unicode码来填充

Unicode 查询 (yunser.com)

Unicode – The World Standard for Text and Emoji

http://www.chi2ko.com/tool/CJK.htm

https://javawind.net/tools/native2ascii.jsp?action=transform

http://tool.oschina.net/encode

http://web.chacuo.net/charsetescape

Unicode和UTF-8

Unicode符号范围(十六进制) UTF-8編码方式二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx10xxxxxx

范例: Unicode转换为UTF-8

汉”的 Unicode码 0x6C49 (110 110001 001001),需要三个字节存储,格式カ:1110xxxx 10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的x,多出的x用0补,得出UTF-8编码为11100110 10110001 10001001

“马”的 Unicode码 0x9A6C (1001 101001 101100),需要三个字节存储,格式为:1110xxxx 10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的x,多出的x用0补,得出UTF-8编码为11101001 10101001 10101100

范例:修改LANG变量来实现中文语言提示

1
2
3
echo $LANG 		# 查看语言
LANG=zh_CN.UTF-8 # 设置中文
LANG=en_US.UTF-8 # 设置英文,默认

命令行及括号扩展

` ` 和 $()

把一个命令的输出打印给另一个命令的参数,放在``中的一定是有输出信息的命令

1
$(COMMAND) 或 `COMMAND`

范例:比较 “ “,’ ‘,``三者区别

1
2
3
4
5
6
7
8
9
10
11
[root@yanglinqi ~]# echo "echo $HOSTNAME"
echo yanglinqi.local
[root@yanglinqi ~]# echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@yanglinqi ~]# echo `echo $HOSTNAME`
yanglinqi.local

# 结论
单引号:强引用,变量和命令都不识别,都当成普通的字符串
双引号:弱引用,不能识别命令,可以识别变量
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,在交给调用反向单引号的命令继续
1
2
3
4
5
date +%F        # 显示今天日期 2022-01-28
touch 2022-01-28.log # 创建 2022-01-28.log文件
date `date +%F`.log # 也是创建 2022-01-28.log文件,先执行``内的命令,使用``输出作为文件名
等价于
date $(date +%F).log

括号扩展:{}

{}可以实现打印重复字符串的简化形式

1
2
{元素1,元素2,元素3}
{元素1..元素2}

范例:

1
2
3
4
5
echo file{1,3,5} # 结果为:file1 file2 file3
echo {1..10}
echo {a..z}
echo {1..10..2} # 1 3 5 7 9 # 1 到 10 是范围, 2 是递增
echo {000..20..2}

范例:

1
2
3
4
5
6
[root@yanglinqi ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[root@yanglinqi ~]# echo {a..z..2}
a c e g i k m o q s u w y
[root@yanglinqi ~]# 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

范例:关闭和启用{}的扩展功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yanglinqi ~]# echo $-
himBHs
[root@yanglinqi ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@yanglinqi ~]# set +B
[root@yanglinqi ~]# echo $-
himHs
[root@yanglinqi ~]# echo {1..10}
{1..10}
[root@yanglinqi ~]# set -B
[root@yanglinqi ~]# echo $-
himBHs
[root@yanglinqi ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10

tab键补全

tab键可以实现命令及路径等补全,提高输入效率避免出错

命令补全

  • 内部命令
  • 外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令
  • 命令的子命令补全,需要安装bash-completion

注意:用户给定的字符串只有一条唯一对应的命令,直接补全,否则,再次tab会给出列表

范例:

1
2
3
[root@yanglinqi ~]# nmcli connection 2TAB
add delete edit help load monitor show
clone down export import modify reload up

路径补全

把用户给出的字符串当做路径开头,并在其指定的上级目录下搜索以指定的字符串开头的文件名

如果唯一:则直接补全

否则:再次Tab给出列表

双击Tab键

1
2
3
4
5
6
7
8
9
command 2TAB   	所有子命令或文件补全
string2TAB 以string开头命令
/2TAB 显示所有根目录下一级目录,包括隐藏目录
./2TAB 当前目录下子目录,包括隐藏目录
*2TAB 当前目录下子目录,不包括隐藏目录
~2TAB 所有用户列表
$2TAB 所有变量
@2TAB /etc/hosts记录
=2TAB 相当于ls -A

命令行历史 history

当执行命令后,系统默认会在内存记录执行过的命令

当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_ history

登录shell时,会读取命令历史文件中记录下的命令加载到内存中

登录进shel后新执行的命令只会记录在内存的缓存区中;这些命令会用户正常退出时“追加”至命令历史文件中

利用命今历史。可以用它来重复执行命令,提高输入效率

命令: history

1
2
3
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]

常用选项:

1
2
3
4
5
6
7
8
9
-c				清空命令历史
-d offset 删除历史中指定的第offset个命令
n 显示最近的n条历史
-a 追加本次会话新执行的命令历史列表至历史文件
-r 读历史文件附加到历史列表
-w 保存历史列表到指定的历史文件
-n 读历史文件中未读过的行到历史列表
-p 展开历史参数成多行,但不存在历史列表中
-s 展开历史参数成一行,附加在历史列表后

命令历史相关环境变量

1
2
3
4
5
6
7
8
9
10
HISTSIZE		命令历史记录的条数
HISTFILE 指定历史文件,默认为~/.bash_history
HISTFILESIZE 命令历史文件记录历史的条数
HISTTIMEFORMAT="%F %T `whoami`" 显示时间和用户
HISTIGNORE="str1:str2*:..." 忽略str1命令,str2开头的历史
HISTCONTROL 控制命令历史的记录方式
ignoredups 默认值,可忽略重复部分,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于ignoredups,ignorespace的组合
erasedups 删除重复命令

持久保存变量

以上变量可以 export 变量名="值" 形式存放在 /etc/profile~./bash_profile

调用命令行历史

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 # 重复前一个命令方法
按上方向键,并回车执行
输入 !! 并回车执行
输入 !-1 并回车执行
按 ctrl+p 并回车执行

!:0 执行前一条命令(去除参数)
!n 执行history命令输出的历史命令中对应序号n的命令
!string 重复前一个以"string"开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,不执行
!$:P 打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !* (上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换成string2
!:gs/string1/string2 将上一条命令中所有的string1替换成string2
使用up (向上) 和down(向下)键来上下浏览从前输入的命令
ctrl+r 在命令历史中搜索命令
(reverse-i-search)`':
ctrl+g 从历史搜索模式退出

# 要重新调用前一个命令中最后一个参数
!$ 表示前一个命令中最后一个参数
Esc,. 点击Esc键后松开,然后点击 . 键
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的快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ctrl+l		清屏,相当于c1ear命令
Ctrl+o 执行当前命令,并重新显示本命令
Ctrl+s 阻止屏出输出,锁定
Ctrl+q 允许屏幕输出,解锁
Ctrl+c 终止命令
Ctrl+z 挂起命令
Ctrl+a 光标移到命令行首,相当于Home
Ctrl+e 光标移到命令行尾,相当于End
Ctrl+f 光标向右移动一个字符
Ctrl+b 光标向左移动一个字符
Ctrl+xx 光标在命令行首和光标之间移动
Alt+f 光标向右移动一个单词尾
Alt+b 光标向左移动一个单词首
Ctrl+u 从光标处册除至命令行首
Ctrl+k 从光标处册除至命令行尾
Alt+r 删除当前整行
Ctrl+w 从光标处向左册除至单词首
Alt+d 从光标处向右册除至单词尾
Alt+Backspace 删除左边单词
Ctrl+d 删除光标处的一个字符
Ctrl+h 删除光标前的一个字符
Ctrl+y 将删除的字符粘贴至光标后
Alt+c 从光标处开始向右更改为首字母大写的单词
Alt+u 从光标处开始,将右边一个单词更改为大写
Alt+l 从光标处开始,将右边一个单词更改为小写
Ctrl+t 交换光标处和之前的字符位置
Alt+t 交换光标处和之前的单词位置
Alt+数字n 提示输入指定字符后,重复显示该字符n次

注意:Alt组合快捷键经常和其它软件冲突

例:xShell 会话的属性 =》终端 =》键盘 =》将和Alt有关的选项全部勾上


获取帮助

多层次的帮助

  • whatis
  • command —help
  • man and info
  • /usr/share/doc/
  • Red Hat documentation、Ubuntu documentation
  • 软件项目网站
  • 其他网站
  • 搜索

whatis

whatis 使用数据库来显示命令的简短描述

此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用

执行下面命令生成数据库

1
2
3
4
# CentOS 7 版本以后
mandb
# CentOS 6 版本之前
makewhatis

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@CentOS8 ~]# whatis cal
cal (1) - display a calendar
cal (1p) - print a calendar
命令名 章节 描述
搭配man使用
man 1 cal # 看display a calendar的内容
man 1p cal # 看print a calendar的内容

查看man章节划分,man类似一个小手册
[root@CentOS8 ~]# man man
....省略...
下表显示了手册的 章节 号及其包含的手册页类型。

1 可执行程序或 shell 命令
2 系统调用(内核提供的函数)
3 库调用(程序库中的函数)
4 特殊文件(通常位于 /dev)
5 文件格式和规范,如 /etc/passwd
6 游戏
7 杂项(包括宏包和规范,如 man(7),groff(7))
8 系统管理命令(通常只针对 root 用户)
9 内核例程 [非标准
...省略...

查看命令的帮助

内部命令帮助

  • help COMMAND
  • man bash

外部命令帮助

  • COMMAND --helpCOMMAND -h
  • 使用man手册( manual): man COMMAND
  • 信息页: info COMMAND
  • 程序自身的帮助文档: README、 INSTALL、 ChangeLog
  • 程序官方文档
  • 相关网站,如:技术论坛
  • 搜索引擎

外部命令的 —help 或 -h 选项

显示用法总结和参数列表,大多数命令使用,但并非所有的

格式说明:

1
2
3
4
5
6
[]			表示可选项
CAPS或<> 表示变化的数据
... 表示一个列表
x|y|z x或y或z
-abc -a -b -c
{} 分组

whatis 确定章节,再用 man 查看想要知道的某部分的详细介绍

范例:

1
2
3
4
5
6
7
8
[root@CentOS8 ~]# whatis passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
[root@CentOS8 ~]# man 5 passwd
省略...
[root@CentOS8 ~]# man 1 passwd
省略...

man命令

man提供命令帮助的文件,手册页存放在 /usr/share/man

几乎每个命令都有man的页面

中文man需安装包

  • man-pages
  • man-pages-zh-CN

man页面分组

不同类型的帮助称为不同的章节,统称为Linux手册,man 1 man

  • 1 可执行程序或 shell 命令
  • 2 系统调用(内核提供的函数)

  • 3 库调用(程序库中的函数)

  • 4 特殊文件(通常位于 /dev)

  • 5 文件格式和规范,如 /etc/passwd

  • 6 游戏

  • 7 杂项(包括宏包和规范,如 man(7),groff(7))

  • 8 系统管理命令(通常只针对 root 用户)

  • 9 Linux内核API

man命令的配置文件:

1
2
3
4
5
6
# CentOS 6 之前 man 的配置文件
/etc/man.config
# CentOS 7 之后 man 的配置文件
/etc/man_db.conf
# Ubuntu man 的配置文件
/etc/manpath.config

格式:

1
MANPATH /PATH/TO/SOMEWHERE		#指明man文件搜索位置

也可以指定位置下搜索 COMMAND命令的手册页并显示

1
man -M /PATH/TO/SOMEWHERE COMMAND

查看man手册页

1
2
man [OPTION...] [SECTION] PAGE...
man [章节] keyword

man帮助段落说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NAME			名称及简要说明
SYNOPSIS 用法格式说明
[] 可选内容
<> 必选内容
a|b 二选一
{} 分组
... 同一内容可出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示例
FILES 相关文件
AUTHOR 作者
COPYRIGHT 版本信息
REPORTING BUGS bug信息
SEE ALSO 其它帮助参考

man 命令的操作方法:使用 less 命令实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
space,^v,^f,^F		向文件尾翻屏
b,^b 向文件首部翻屏
d,^d 向文件尾部翻半屏
u,^u 向文件首部翻半屏
RETURN,^N,e,^E or j or ^J 向文件尾部翻一行
y or ^Y or ^P or k or ^K 向文件首部翻一行
q 退出
# 跳转至第#行
1G 回到文件首部
G 翻至文件尾部
/KEYWORD 以 KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索:不区分字符大小写
n:下一个
N:上一个
?KEYWORD 以 KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索:不区分字符大小写
n:跟搜索命令同方向,下一个
N:跟搜索命令反方向

常用选项

  • 列出所有帮助

    1
    man -a keyword
  • 搜索man手册

    1
    2
    # 列出所有匹配的页面,使用 whatis 数据库
    man -k keyword # 相当于 whatis
  • 打印 man 帮助文件路径

    1
    man -w [章节] keyword

info

man常用于命令参考,GNU工具info适合通用文档参考
没有参数,列出所有的页面
info 页面的结构就像一个网站
每一页分为“节点”
链接节点之前*

info命令格式

1
info [命令]

导航info页

  • 方向键,Pgup,PgDn 导航
  • Tab键 移动到下一个链接
  • d 显示主题目录
  • Home 显示主题首部
  • Enter 进入选定链接
  • n/p/u/l 进入下/前/上一层/最后一个 链接
  • 5 文字 文本搜索
  • q 退出 info

命令自身提供的官方使用指南

/usr/share/doc目录

多数安装了的软件包的子目录,包括了这些软件的相关原理说明
常见文档:README INSTALL CHANGES
不适合其它地方的文档的位置
配置文件范例
HTML/PDF/PS 格式的文档
授权书详情

系统及第三方应用官方文档

通过在线文档获取帮助

http://www.github.com

https://www.kernel.org/doc/html/latest/

http://httpd.apache.org

http://www.nginx.org

https://mariadb.com/kb/en

https://dev.mysql.com/doc/

http://tomcat.apache.org

https://jenkins.io/zh/doc/

https://kubernetes.io/docs/home/

https://docs.openstack.org/train/

http://wwwpython.org

http://php.net

欢迎关注我的其它发布渠道