Linux 命令行界面介绍

内容纲要

查看【Linux】专题可浏览更多内容

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

如果没有就去安装一个吧

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

Linux 命令行界面介绍

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

Linux 命令行界面介绍

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

Linux 命令行界面介绍

这就是「终端仿真器(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 快捷键

  • 将光标跳至句首: Ctrl + A
  • 将光标跳至句尾: Ctrl + E
  • 「剪切」当前光标之前输入的命令:Ctrl + U
  • 「剪切」当前光标之后输入的命令:Ctrl + K
  • 「粘贴」所「剪切」的命令:Ctrl + Y
  • 清除屏幕: Ctrl + L
  • 反向搜索: Ctrl + R

另外,Windows 用户可能想要使用 Ctrl + CCtrl + V 进行复制粘贴,但它们在 Linux 中另有含义,所以为了避免歧义,需要再加上 shift 键。

命令历史记录

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

可以使用 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。


参考

延伸