内容纲要

🗂 | 查看 Linux 专题可浏览更多内容


对于学习和使用 Linux 来说,命令似乎是个绕不过去的坎,那就从学习使用命令开始吧

如果你还没有一个 Linux 环境,可以查看上一篇文章《Linux | 使用虚拟机 VirtualBox 安装 Debian GNU/Linux》来搭建一个 Linux 环境。

如何使用命令行界面

在 Linux 上使用命令行有两种方法,一种是如前文安装了一个不带桌面环境的系统,开机就进入了「虚拟控制台」:

如果使用的是带有桌面环境的 Linux 系统,一般系统会自带有「终端仿真器」,搜索「终端」或「Terminal」可以找到它们:

不管是「终端仿真器」和「虚拟控制台」,它们所做的都是让你访问 Shell,而我们通常所说的对命令行其实指的就是 Shell,Shell 是接收由键盘输入的命令并将其传递给操作系统来执行的程序。

在「虚拟控制台」或是「终端仿真器」,可以看到一个这样组成的提示符:

<用户名>@<主机名>:<工作目录><用户身份>

说明

  • 用户名:如上图,我的用户名为 conners;
  • 主机名:系统的主机名,这里为 debian;
  • 工作目录: 表示当前的工作目录,在首次登陆系统或启动终端仿真器时会显示 ~~ 表示当前用户的主目录位置,也就是 /home/conners,而之后当改变当前目录为其他目录时就会显示目录的名称;
  • 用户身份:$ 代表普通用户权限,如果显示的是 # 表示当前会话拥有超级用户权限,如使用 root 用户或终端仿真器提供了超级用户权限;

也就是说,「提示符」表明当前以用户 conners 在主机名 debian 的机器上,在主目录以普通用户权限进行工作。

命令的组成

那么如何执行一条命令呢?在 $ 符号的后面可以看到光标,直接输入然后按下 Enter 回车键就可以运行一条命令了。

随意输入一条命令 123 并回车,会看到返回结果 -bash: 123: command not found,这表示找不到这样的命令 (因为没有这样的命令)。

在使用命令前还需要了解下命令的基本组成。

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

command -options arguments

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

查看时间使用 date 命令:

$ date

查看日历使用 cal 命令:

$ cal

💡 你正在使用的系统可能并没有预装相关的包导致你在使用 cal 命令时提示 -bash: cal: command not found
Debian 及基于 Debian 的衍生 Linux 发行版可以安装名为 bsdmainutils 的包;
Red Hat 及基于 Red Hat 的衍生 Linux 发行版可以安装名为 util-linux 的包;
Linux 安装软件的方法先暂且不表,之后的文章会讲。

命令搭配选项及参数的一些用法:

# 显示 UTC
$ date --utc
# 一些选项是有简写的,比如 --utc 可以简写成 -u
$ date -u

# 查看当年日历
$ cal -y

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

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

编辑命令

使用方向键的左右键可以调整光标到已输入命令的任意位置以编辑命令。

命令历史记录

使用方向键的上下键可以显示之前输入的命令,当又要使用刚才不久才使用过的命令时就不用重新输入了。

💡 大部分 Linux 发行版可以记住最近的 1000 条命令。

退出终端

在带有图形界面的桌面操作系统中,直接关掉终端仿真器的窗口即可。也可以使用命令 exit,或按下 Ctrl + D 都可用于结束终端会话。

当谈论命令行时到底在说什么?

CLI 和 Shell

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

当谈论命令行时其实指的是 Shell,Shell 是一个接收由键盘输入的命令并将其传递给操作系统来执行的程序,也被称为命令行解释器 (command-line interpreter) 或命令行处理器 (command-line processor)。

几乎所有的 Linux 发行版都提供了来自 GNU 项目的 Shell 程序 —— Bash。还记得开头随意输入 123 时 Bash 告诉我们找不到这样的命令 (-bash: 123: command not found) 吗?

Bash 是 Bourne Again Shell 的缩写,以此表明 Bash 是 sh 的增强版,而 sh 是由 Steve Bourne 编写的最初的 UNIX 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 与 Virtual Console

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

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

如文章开头这样没有安装桌面环境的 Linux 发行版在开机的时候会进入到 tty1,也就是按下 Ctrl + Alt + F1 所进入到的界面。

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

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


参考

延伸