2.2 初试牛刀——Linux字符命令
# 8. 初窥门径——Linux字符命令
本篇先介绍系统内核和Shell (opens new window)终端的关系与作用,然后介绍使用Bash与系统交互的优势。最后选择了一些有趣和常用的命令来初探Linux的命令格式。
# 8.1 强大的Shell
通常来讲,计算机硬件由运算器、控制器、存储器、输入设备、输出设备等共同组成,而让各种硬件设备各司其职又能协同运行的就是系统内核——Linux系统内核就是负责对硬件资源进行分配、调度。也正是因为内核和硬件的联系非常紧密,一般内核是不会那么容易开放给用户编辑参数——🐻熊孩子的威力太大了,而是让用户通过基于系统调用接口开发出的程序和服务来管理计算机。
Shell就是这样的一类命令行工具。Shell(也被称为壳程序)充当的是人与内核(硬件)的翻译官——用户在Shell中输入一些命令,Shell调用相应的程序服务来完成相应的工作。现在包括CentOS等红帽系以及其它主流Linux发行版默认使用的Shell是Bash(Bourne-Again SHell)解释器。之所以选用Bash作为命令行解释器是因为以下的优势:
- 友好的历史命令回滚:通过 **↑ ↓ **方向键调取最近执行的Linux命令;
- Tab补全:输入部分命令或参数可以使用Tab键进行补全或列出所有的选择项;
- 批处理:可以使用Bash编写一些具有变量、控制逻辑的程序脚本,以此完成复杂的批处理任务;
- 环境变量:Linux具有很多有趣的环境变量,提供可丰富的程序与系统状态信息;
图形化与字符命令管理
不可否认的是,使用图形化工具在很多时候非常省事——比如安装Linux时的图形化系统安装程序,极大地降低了Linux用户的进入门槛和出错率,但是图形化界面本质上还是调用的可执行命令文件来完成相应操作——比如修改时区、密码,往往只是针对特定的任务而设计,缺乏必要的灵活性和可控性。
图形管理界面的设计往往只能应对需求已知、流程固化、变更稳定的管理需求——然而服务器在实际的运行过程中,往往会产生更新、更复杂的管理任务,这时候固定的图形设计会成为一种束缚。
而且在服务器安装图形界面往往带来了额外系统资源消耗。然而是不是一概的拒绝图形界面呢,比如想要查看系统资源的运行状况,还有管理各个微服务的运行状态,如果一个个用字符界面查看,效率是非常低的,所以现在一种折中的方案是——管理员通过浏览器输入某个服务器URL地址,相应的服务器会给其监控的服务器请求状态数据或者给其管理的服务器发送控制信息,收到结果后经过该服务器后端的处理,交给前端页面渲染后就可以完整的监控/管理服务器了。
# 8.2 Linux 命令风格
Linux常见的格式都是
命令名称 [[命令选项] [选项参数] ...] [命令对象]
Command [[Options] [Paramenter]...] [Object]
2
关于格式的说明:
- 一个指令第一个输入的绝对是“指令(command)”——其实是可执行文件的名称;
- 中括号[]并不存在于实际指令中,而是指的是可选,
ls
命令的功能是列出文件:ls
:查看当前文件夹下的文件(不包含隐藏文件);ls -a
:查看当前文件夹下文件(包含隐藏文件);ls -a 文件夹A
:查看文件夹A
下的所有文件;
而值得注意的是,在命令选项尤其是多命令选项的情况下,不同程序可能有不同的格式——指令风格。 Linux常见的指令风格有三种:
- Unix风格的参数,使用短格式——前面加单
-
; - GNU风格的长参数,使用长格式——前面加
--
; - X toolkit 风格,这是一种比较不常见的风格,使用单个连字符加上关键词。只有 X 相关的程序才使用这种风格,一般不建议使用;
# ① Unix 风格——短格式
原始的Unix传统中,命令行选项是以连字符
-
开头的;后面不带选项参数的命令选项可以组合在一起使用,例如:如果
-a
与-b
是命令选项,那么-ab
和-ba
都是合法的命令选项;如果选项有参数的话,这些参数必须接着选项后面(是否以空格分隔可选,但使用空格分隔在现在更为普遍);
比如:
mysql -u root -h localhost -p
mysql -uroot -hlocalhost -p
2
上面两个连接数据库的命令格式都是正确的,表示通过密码以数据库root用户登录本机数据库。
选项和参数的空格
Mysql 是比较典型的使用Unix风格来设计命令选项和参数,命令选项和参数要不要加空格具体要看程序是怎样进行设计的,不过在Linux上,命令选项与命令空格之间留下空格是更为普遍和兼容的做法。
Unix 风格的选项偏爱小写字符而非大写字符,如果使用大写字符,把他们作为小写字符选项的特殊做法是一种很好的做法。
原始的Unix 风格从速度缓慢、以精炼唯美的ASR-33 电传打字机发展起来,所以形成了这样的单字符选项。按住"Shift"键也需要额外的经历,所以优先选择可小写字符和 -
(而不是更合乎逻辑的+
)来启动选项。
# ② GNU 风格——长格式
GNU 风格使用前面有两个连字符的选项关键单词(而不是单个字母)。这是在一些相当复杂的GNU程序用完单字母选项后的几年内发展起来的(这只是一种治标不治本的方法)。这种风格仍然非常流行,是因为GNU选项比老式滥用的单字母更容易理解。GNU风格的选项不能组合使用,**选项参数既可以用空白分隔也可以用单个“=”**来分隔。
之所以GNU选择双连字符选项引导符,是因为传统的单字母选项和GNU风格的关键字选项可以在同一命令行内混合使用而不会混淆。因此,如果设计的选项不多并且比较简单时,可以使用Unix 风格,而以后必须转移到GNU 风格时也不会太麻烦;另一方面,如果使用GNU 风格的,良好实践是,至少对最常用的选项添加单字母等效选项。
比如经典的mysql数据库:
mysql -u root -h localhost -D test -p
mysql --user=root --host=localhost --database=test --password
2
3
上面第一条命令使用的Unix风格和下面的GNU风格是等价的,都是通过密码方式以root用户登录主机的test数据库:
-D, --database=name Database to use.
-h, --host=name Connect to host.
-p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty.
-u, --user=name User for login if not current user.
2
3
4
5
6
# ③ X toolkit 风格
可能有点迷的是,X toolkit 风格使用了单连字符和关键字选项并由 X toolkit 进行解析。它首先过滤并处理选项(比如-geometry
和-display
)然后再把过滤后的命令行传递给应用程序逻辑进行解析。这种风格既不能和古典的Unix风格又不能和GNU风格很好的箭筒,所以不应该在新程序中使用,除非是为了兼容老式的X应用。
xeyes -display joesws:0 -geometry 1000x1000+0+0
# 8.3 有趣的几个指令
一般如果远程连接服务器的话,直接进入的环境就是bash shell
环境, 而如果安装了Linux 桌面程序的话,也有专门的终端程序(terminal)提供字符交互环境:
程序 | 图片 | 备注 |
---|---|---|
gnome-terminal | Linux | |
iterm2 | Mac |
# ① 显示日期 date
[gocifer@centos7 ~]$ date
Mon Oct 5 21:33:15 CST 2020
2
上面显示的结果是:
- 星期:Monday
- 月份:October
- 日期:5
- 时间:21:33:15
- 时区:CST——China Standard Time UT+8:00
此外可以通过 +
后面跟上一些格式化输出符号来仅仅输出想要的时间信息:
[gocifer@centos7 ~]$ date +%Y/%m/%d #以 年/月/日 的格式输出日期
2020/10/05
[gocifer@centos7 ~]$ date +%H:%M ##以 小时:分钟 的格式输出时间
21:45
2
3
4
GMT、UTC、DST、CST时间戳
GMT:Greenwich Mean Time
格林威治标准时间 ; 英国伦敦格林威治定为0°经线开始的地方,地球每15°经度 被分为一个时区,共分为24个时区,相邻时区相差一小时;例: 中国北京位于东八区,GMT时间比北京时间慢8小时。
UTC: Coordinated Universal Time
世界协调时间;经严谨计算得到的时间,精确到秒,误差在0.9s以内, 是比GMT更为精确的世界时间
DST: Daylight Saving Time
夏季节约时间,即夏令时;是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时;
CST:四个不同时区的缩写:
- Central Standard Time (USA) UT-6:00 美国标准时间
- Central Standard Time (Australia) UT+9:30 澳大利亚标准时间
- China Standard Time UT+8:00 中国标准时间
- Cuba Standard Time UT-4:00 古巴标准时间
时间戳:表示从1970年1月1日 00:00:00到现在所经历的秒数,与时区无关
# ② 显示日历 cal
指令格式是:
cal [month] [year]
最简单的是输出当前月份信息:
[gocifer@centos7 ~]$ cal
October 2020
Su Mo Tu We Th Fr Sa
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
2
3
4
5
6
7
8
9
除了本月的日历之外,今日所在的日期处会有反白显示,此外可以指定年份显示整年的日历:
[gocifer@centos7 ~]$ cal 2020
2020
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 1 1 2 3 4 5 6 7
5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
12 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
19 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
26 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 1 2 1 2 3 4 5 6
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
31
July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 1 1 2 3 4 5
5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
30 31
October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
25 26 27 28 29 30 31 29 30 27 28 29 30 31
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
或者指定具体某年某月:
[gocifer@centos7 ~]$ cal 8 2022
August 2022
Su Mo Tu We Th Fr Sa
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
2
3
4
5
6
7
8
# ③ 简单的计算器 bc
使用字符设计的程序还是可以非常使用有趣的呢,比如计算机 bc
,输入后终端会显示版本信息,然后等待输入计算公式:
[gocifer@centos7 ~]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty`.
▌ #光标在此处等待输入公式
2
3
4
5
6
bc支持常见的运算:
加法
+
减法
-
乘法
*
除法
/
指数
^
余数
%
下面是一则计算示例:
[gocifer@centos7 ~]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+7*6
47
10^8/(10^6)
100
10/20
0 #咦???
scale=3
10/20
.500
1/3
.333
quit
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
通过quit
结束 bc
,返回bash
小数运算
要注意的是第10行的运算 10/20
最后的结果竟然是 0
,因为 bc 默认使用整数进行计算,因此结果只输出整数,想要输出小数位,就必须先执行 scale=位数
,就像12-14 行一样。
# 8.4 Bash交互
简单的敲了几个有趣的命令后,认识一下常见的shell环境:
[gocifer@centos7 ~]$
bash每一条新命令必须在如上的命令提示符后面输入;
按下
[Enter]
回车后代表一行指令开始启动;指令太长可以使用反斜线
\
来转义[Enter]
回车符为普通空格,使指令可以连续到下一行:mysql --user=root \ --host=localhost \ --database=test \ --password
1
2
3
4Bash当中英文大小写是不一样的(区别于DOS),比如
ls
和LS
可以通过
↑ ↓
方向键调取最近(前一个、后一个)执行的Linux命令;
bash 本身是一个解释输入的解释器,提供了基于字符的终端交互功能,绝大多数指令在输入后几乎立刻回打印出结果——例如日历
cal
、日期date
,但有些指令(可执行文件)的功能不是打印输出信息,而是提供类似bash解释器
这种基于字符交互的各种功能——例如计算器bc
、编辑器vim
和emacs
、python
解释器。对于这种通过bash调用的提供一定交互功能的软件,必须要先根据相关软件的设置退出,才能回到之前的bash
环境。
# 8.5 Bash快捷键
快捷键 | 功能 |
---|---|
Tab | 命令、参数、文件补全 |
Ctrl - C | 终止正在输入或^C的指令,原地留下 ^C 字符 |
Ctrl - D | 退出当前终端/命令行/远程连接(相当于exit );或者结束键盘输入(End Of File、EOF、End of Input) |
Shift - PgUp/PgDn | 有限的终端窗口/屏幕只会显示最新的信息,通过该快捷键可以像鼠标滑轮来滚动文字页面 |
Ctrl - A | 把光标从当前位置移动到命令行最前面,不修改已经输入的命令字符 |
Ctrl - E | 把光标从当前位置移动到命令行最后面,不修改已经输入的命令字符 |
Ctrl - U | 擦除当前光标位置之前的所有字符 |
Ctrl - K | 擦除当前光标位置之后的所有字符 |
Ctrl - W | 擦除光标位置前的单词。 如果光标在一个单词本身上,它将擦除从光标位置到词首的全部字母 |
Ctrl + Y | 粘贴使用 Ctrl+W,Ctrl+U 和 Ctrl+K 快捷键擦除的文本 |
Ctrl - L | 把当前终端页面的所有字符行向上滚动一页隐藏——不擦除,在终端开始全新的一页 |
Ctrl + R | 使用该快捷键来搜索历史命令 |
Ctrl + P | 查看上一个命令,反复按该键来返回到历史命令。 在很多终端里,使用 PgUp 键来实现相同的功能 |
Ctrl + N | 显示下一个命令。 如果使用 Ctrl+P 查看上一条命令,你可以使用 Ctrl+N 来回导航。 许多终端都把此快捷键映射到 PgDn 键 |
Ctrl + Z | 该快捷键将正在运行的程序送到后台。 也可以在指令最后空格加上& 字符,起到一样的功能 |
Tab补全
一次[Tab]:如果有唯一可以匹配补全的命令、参数、文件,会自动补全,例如输入关机命令的部分字符后按Tab
shutdo[tab]
,则会自动补全为shutdown
二次[Tab]:如果一次Tab没有补全后迅速再按一下,则会列出所以可供选择的命令、参数、文件,比如显示当前目录路径
pwd
:[gocifer@centos7 ~]$ pw[tab][tab] pwck pwd pwhistory_helper pwscore pwconv pwdx pwmake pwunconv
1
2
3若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行“选项/参数的补齐”功能!