内容纲要

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


通过之前的文章《Linux | 在 VirtualBox 中安装 Debian GNU/Linux》,你现在应该已经有了一个 Linux 使用环境了

如果没有就去安装一个吧

在之前的文章中,安装系统时选择的安装软件勾选了「桌面环境」并选择了「Gnome」,如果没有勾选安装,在安装完成并进入系统后将会看到一团黑乎乎的界面:

where to start with linux command line 1

这个便是「虚拟控制台(Virtual Console)」

where to start with linux command line 2

而如果安装了「桌面环境」,你可以通过搜索「Terminal」并打开

where to start with linux command line 3

这就是「终端仿真器(Terminal Emulator)」,简称「终端」

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

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

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

说明

  • 用户名:如上图的用户名为 conners
  • 主机名:系统的主机名,如上图为 debian;
  • 工作目录: 表示当前的工作目录,在首次登陆系统或启动终端仿真器时会显示 ~~ 表示当前用户的主目录位置,也就是 /home/conners(一般根据用户名创建在 /home 下),而之后当改变当前目录为其他目录时就会显示目录的名称;
  • 用户身份:$ 代表普通用户权限,如果显示的是 # 表示当前会话拥有超级用户权限,如使用 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 # 等同于 --utc

# 查看当年日历
cal -y

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

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

命令区分大小写

需要注意命令是区分大小写的

补全命令

使用命令补全可以节省很多时间,例如在使用 date 命令时,输入到 dat,按下 Tab 键就可以补全 date

❓ 那么输入到 da 时按下 Tab 键会发生什么呢?
你会发现按下 Tab 键时没有任何反应,因为有很多以 da 开头的命令所以就没办法自动补全了,此时再一次 Tab 键,就可以看到这些以 da 开头的命令

编辑命令

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

使用 Ctrl + A 可以将光标跳至句首。

使用 Ctrl + E 可以将光标跳至句尾。

命令历史记录

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

可以使用 history 命令查看历史输入过的命令,还有些与之配合的小技巧:

  • 使用命令 !! 使用上一条命令;
  • 使用命令 ![号码],如使用历史命令的第五条,可以这样:!5,还可以使用负数,如使用历史命令的倒数第三条命令:!-3
  • 使用命令 history -c 可清除历史记录;

💡 大部分 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 系统为了支持这些电传打字机,就设计了名为「TTYTeleTYpewriter)」的子系统,虽然电传打字机原本的用途是在电报线路上收发电报,但当电传打字机连接到计算机后,就变成了使用键盘发送信号,然后将返回的结果打印在纸带上。

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

所以一台计算机上一般只有一个 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。


参考

延伸