内容纲要

🗂 | 本文目录: Linux 指南


概念

在开始之前先了解一些概念:

CLI

什么是命令行界面 (Command Line Interface, CLI) ?使用文本命令进行交互的用户界面就是命令行界面。

命令行界面以行文本的形式处理计算机程序的命令,处理该接口的程序被称为命令行解释器 (command-line interpreter) 或命令行处理器 (command-line processor),也就是 Shell。

Terminal、Console、TTY

在早期的计算机,有一种带有输入输出功能的外部设置用来与计算机进行进行交互,这种设备就叫做 Terminal (终端或终端机)。

其中有一种特殊的终端,是计算机的一个组成部分(与计算机一体),叫做 Console (控制台)。

Unix 的创始人 Ken Thompson 和 Dennis Ritchie 想让 Unix 成为一个多用户系统,多用户就意味着需要多个终端,但当时的计算机价格十分昂贵,输入和输出设备与主机是集成在一起的,不像现在有独立的键盘和显示器,机智的他们找到了电传打字机(最初是 ASR-33 电传打字机)。

Unix 系统为了支持这些电传打字机,就设计了名为 TTY(TeleTYpewriter) 的子系统,虽然电传打字机原本的用途是在电报线路上收发电报,但当电传打字机连接到计算机后,就变成了使用键盘发送信号,然后将返回的结果打印在纸带上。

在今天可能很难想象程序的运行结果需要等到打印出来才能看到

所以一台计算机上一般只有一个 Console (控制台),但可以连接很多个 Terminal (终端)。控制台用于管理主机的,只给系统管理员使用,有着比普通终端更大的权限。

随着时代的进步,个人电脑的普及,终端设备已经不再限制于电传打字机,而 Terminal 与 Console 的概念也逐渐淡化,现在一般用 TTY 代表计算机终端 (Terminal)

Terminal Emulator

今天电传打字机已经进了博物馆,但 Linux/Unix 仍然保留了当初 TTY 驱动和 line discipline 的设计和功能。终端不再是一个需要通过 UART 连接到计算机上物理设备。终端成为内核的一个模块,它可以直接向 TTY 驱动发送字符,并从 TTY 驱动读取响应然后打印到屏幕上。也就是说,用内核模块模拟物理终端设备,因此被称为终端模拟器 (Terminal Emulator),严格来说应该叫终端仿真器。

在 Linux 下,按下 Ctrl + Alt + F1~6 就可以进入到 Virtual Console (虚拟控制台),而按下 Ctrl + Alt + F7 就可以回到图形界面。

还有一种是在图形化界面下系统自带或者第三方提供的终端仿真器。比如 macOS 上的 Terminal.app、iTerm2.app,Linux 上的 GNOME Terminal、Konsole,Windows 上的 Windows Terminal 等等。

Virtual Console (虚拟控制台)这样全屏的终端界面与 Terminal Window (终端窗口) 这样的终端仿真器的不同之处在于,前者由操作系统内核直接提供的。但它们所在的事情都相同, 也就是让用户得以访问 Shell。

Shell

什么是 Shell?Shell 是一个程序,它接收由键盘输入的命令并将其传递给操作系统来执行,执行完毕后再将结果反馈给用户。

Shell 通常可以分为两种:命令行 Shell 与图形 Shell,例如 Windows 下的 explorer.exe 就是一个图形 Shell,而几乎所有的 Linux 发行版都提供了来自 GNU 项目的命令行 Shell 程序 Bash。

Bash 是 Bourne Again Shell 的缩写,以此表明 Bash 是 sh 的增强版,而 sh 是由史蒂夫·伯恩(Steve Bourne)编写的最初的 UNIX Shell 程序。

终端仿真器

打开系统上的终端,如果 Linux 没有安装桌面环境那么在开机的时候会进入到 tty1,也就是按下 Ctrl + Alt + F1 所进入到的界面。

你会看到类似这样的提示符:

[email protected]:~$

这一般出现在 Shell 已经准备好接收输入的时候,它由 4 种信息组成:

<用户名>@<主机名>:<工作目录><用户身份>
  • 用户名:conners;
  • 主机名:debian;
  • ~~ 代表当前用户的主目录,也就是 /home/conners,如果在别的路径则会显示路径;
  • $$代表普通用户,如果使用 root 用户时会变成 #

这样时候随便输入一条命令,比如 123,会显示 -bash: 123: command not found,也就是找不到这样的命令,那么命令是怎样的?

命令的组成

命令由「命令」、「选项」以及「参数」组成

command -options arguments

「选项」和「参数」一般是可选的,而「选项」前一般是带上 -,可以此进行区分。

查看时间:

$ date

查看日历:

$ cal

cal 命令搭配选项的一些用法:

# 查看当年日历
$ cal -y

# 查看指定年份的日历
$ cal -y 2020 # 可以简写成:cal 2020

# 查看最近 3 个月的日历
$ cal -3

浏览目录

现在知道命令的基本使用了,那么浏览电脑上的文件呢?

文件系统表现为单个统一的层次结构:以 / 目录(也叫作根目录)为起点,向下延伸出任意多个子目录,也就是一个倒过来的树形结构。(和 Windows 不同,Windows 保留了特定磁盘的名字空间概念)

路径名是由找到该文件所必须经过的一系列目录以及文件名组成。路径名可以是绝对形式(/etc/hosts)也可以是相对形式(./conf/file.conf,以当前目录作为起点)。

pwd:显示当前目录路径,「我在哪」

使用 pwd (print working directory) 命令来显示当前目录的绝对路径。

$ pwd

如前面所说的 ~,想知道 ~ 的具体路径可以使用 pwd 查看:

$ pwd ~

cd:更改当前目录,「去到哪」

cd (change directory) 命令用于更改当前工作目录

# 切换到指定目录 cd <目录路径>,如:
$ cd /home
# 切换到主目录
$ cd ~

如果要进入到一长串的路径,其中的文件夹名称太长难以记住也不要紧。比如要进入根目录下的 etc 目录,但是只记得是 e 字母开头,那么可以在输入到 cd e 的时候,按 Tab 键(Q 键左边)就会自动补全 etc 整个目录的名称。

但是如果说有很多个目录都是 e 开头的情况,比如系统 etc 目录下有很多 rc 开头的目录我要进入名为 rcS.d 但是记不起全称时按两下 Tab 键:

$ cd /etc/r # 此时按两下「Tab」键 Shell 就会列出可能相关的目录
rc0.d/     rc2.d/     rc4.d/     rc6.d/     rsyslog.d/ 
rc1.d/     rc3.d/     rc5.d/     rcS.d/     runit/

利用补全功能让操作更为灵活而且提高效率。

一些小技巧:

  • -:之前所在的目录;
  • .:当前目录;
  • ..:当前目录的上一级;
# 回到之前的目录
$ cd -

# 假设当前目录下还有个名为 123 的目录
$ cd ./123
# 还可以进一步简写为:
$ cd 123

# 比如当前在 /home/tom,想要去到上一级目录也就是 /home
# 除了使用 cd /home 还可以更简单:
$ cd ..

# 进一步,去到上一层目录下的另一个目录
# /home 除了 tom 还有 jerry,你当前在 tom 目录想要去 jerry 目录:
$ cd ../jerry

ls:列出目录内容,「都有什么」

ls 用于显示目标目录中的所有内容。

# 等同于「ls .」,列出当前目录下有什么
$ ls
# 列出指定目标目录里有什么,比如列出 home 目录
$ ls /home

ls 命令是强大的,可以使用 man ls 来查看其更多的作用,使用其「选项」来做到更多操作。

ls 常用选项

选项 作用
-l 显示详细信息
-d 显示目录信息而非目录内容
-h 显示常用文件体积格式
-a 显示隐藏文件
-r 以相反次序显示(原按英文字母次序)
-t 以时间修改顺序显示
-R 递归显示

获取帮助

各式各样的命令只靠死记硬背是不现实也不灵活,所以可以依靠互联网获取知识:

  • 搜索引擎
  • 官网文档
  • 社区论坛

还可以使用帮助命令来了解一个命令的具体作用,主要可以使用以下三个帮助命令

  • man
  • help
  • info

man

man 即是 manual(手册) 的缩写,在 man 后加上你要查询的命令,比如

$ man man

查看一下 man 命令本身的帮助信息。

在帮助信息内,使用方向键或者 PgUp 键和 PgDn 键上下翻页,q 键退出。

⚠️注意:帮助信息也是可以有中文的,如果你有需要看中文帮助的需求可以安装中文语言包。

man 章节

在使用命令 man man 后可以看到左上角有个「MAN(1) 」这表示这是 man 的第一个篇章。

也就是说实际上使用 man 时是可以获得不同篇章的帮助,且实际上

$ man man
# 其实等同于
$ man 1 man
# 只是进一步的省略掉了

MAN 有 9 个章节,具体如下:

# 名称
1 Executable programs or shell commands
可执行程序或 shell 命令
2 System calls (functions provided by the kernel)
系统调用(内核提供的函数)
3 Library calls (functions within program libraries)
系统调用(内核提供的函数)
4 Special files (usually found in /dev)
特殊文件(通常位于 /dev)
5 File formats and conventions eg /etc/passwd
文件格式和规范,如 /etc/passwd
6 Games
游戏
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
杂项(包括宏包和规范)
8 System administration commands (usually only for root)
系统管理命令(通常针对 root 用户)
9 Kernel routines [Non standard]
内核标准[非标准]

因为有时候命令、系统文件调用可能会有重名的情况,所以要加上章节进行区分。

以修改密码的命令 passwd 为例,它既是命令也是配置文件(/etc/passwd),所以 1 和 5 节都有关于它的内容,加上章节后就可以看到各自的帮助信息。

# 查看 passwd 命令的帮助信息
$ man passwd # 或者 man 1 passwd

# 查看 /etc/passwd 文件的帮助信息
$ man 5 passwd

查找命令章节

如果你只知道「passwd」这么一个命令名,但是不确定其是命令、文件还是其他如库调用,那么可以使用 -a 选项带上参数也就是要查找的命令名:

$ man -a passwd

在打开的帮助信息的左上角显示的是「PASSWD(1)」则代表第一章,如果不是想要的结果可以按 q 退出后看到提示

--Man-- next: passwd(1ssl) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

MAN 会找到下一条可能相关的,如果要查看按回车,或者使用 Ctrl + D 跳过继续看看接下来找到的相关,再或者按 Ctrl + C 退出。

在跳过「passwd(1ssl)」后就会看到之前示例的「passwd(5)」

查找关键词

可以使用 -k 选项加上关键词可以获取可能相关的命令

$ man -k passwd

返回:

chgpasswd (8)        - update group passwords in batch mode
chpasswd (8)         - update passwords in batch mode
gpasswd (1)          - administer /etc/group and /etc/gshadow
grub-mkpasswd-pbkdf2 (1) - generate hashed password for GRUB
openssl-passwd (1ssl) - compute password hashes
pam_localuser (8)    - require users to be listed in /etc/passwd
passwd (1)           - change user password
passwd (1ssl)        - compute password hashes
passwd (5)           - the password file
update-passwd (8)    - safely update /etc/passwd, /etc/shadow and /etc/group

help

Shell 自带的命令为内建命令,其他的命令为外部命令,而 help 的使用也有所区别。

区别命令为内建或外部

首先查看一个命令是内建还是外部命令使用 type 命令

# 内建命令示例
$ type pwd # pwd is a shell builtin
$ type cd # cd is a shell builtin

# 外部命令示例
$ type ls # ls is aliased to `ls --color=auto',这是一个别名
$ type mkdir # mkdir is /bin/mkdir,这是一个文件

内建命令与外部命令

# 内建命令使用 help
$ help cd

# 外部命令使用 --help
# 如之前使用 `man` 命令时 `-a` 和 `-k` 选项的含义是什么,就可以使用
$ man --help

info

infohelp 更详细,可以作为 help 的补充

$ info ls

参考

延伸