总览
Linux 命令行是您与计算机之间的一种文本交互界面。它常被称为 shell、终端、控制台、提示符或其他名称,用起来可能会让人觉得复杂而困惑。然而,既可以从网站上复制粘贴命令,又能获得命令行所提供的强大与灵活,这意味着使用它是必不可少的。
本教程会先向您介绍一些命令行的历史,然后带您完成一些实践练习,让您熟悉一些基本的命令和概念。我们不假定您具备任何预备知识,但我们希望在结束时,下一次当您面对以「打开一个终端」开头的操作说明时,能感到更自在一些。
最初由 peppertop 撰写。
您将学到什么
- 一点命令行的历史
- 如何在自己的计算机上打开命令行
- 如何进行基本的文件操作
- 另外一些有用的命令
- 如何把命令串联起来,构造更强大的工具
- 使用管理员权限的最佳方式
您需要准备什么
- 一台运行 Ubuntu 或其他版本 Linux 的计算机
每一个 Linux 系统都包含某种形式的命令行。本教程包含一些针对 Ubuntu 的具体步骤,但其中大部分内容无论您使用哪个 Linux 发行版都应当适用。
打开一个终端
在 Ubuntu 18.04 桌面环境的系统上,您可以点击屏幕左上角的 活动 项,然后输入「terminal」「commande」「invite」或「shell」的前几个字母,来找到终端的启动器。是的,开发者已经把所有最常见的同义词都配置到了启动器中,因此您找到它应该没有任何困难。

其他版本的 Linux,或者其他版本的 Ubuntu,通常会把终端启动器放在与其他应用程序启动器相同的位置。它可能藏在某个子菜单里,或者您需要在启动器中搜索它,但它多半就在某个地方。
如果您找不到启动器,或者只是想用更快的方式打开终端,大多数 Linux 系统都使用同一个默认快捷键来启动它:Ctrl-Alt-T。
无论您以何种方式启动终端,您最终看到的都会是一个相当朴素的窗口,顶部有一小段有些奇怪的文字,类似下面的图片。根据您使用的 Linux 系统,颜色可能不同,文字内容大概也会不一样,但一个带有大片(几乎空白)文本区域的窗口,其总体布局应该是相似的。
让我们运行第一条命令。用鼠标点击窗口内部,确保您的按键会输入到这里,然后输入下面这条命令,全部小写,再按 Enter 键或 Return 键来执行它。
pwd
您应该会看到打印出一个目录路径(多半类似 /home/您的用户名),然后在它上方,是这条命令的又一份副本。
当您执行一条命令时,它产生的任何输出通常都会直接打印在终端里,命令结束后会再显示一个提示符。有些命令可能产生大量文本,另一些则会安静地运行,完全不输出任何内容。如果您执行了一条命令而提示符立刻又出现了,不必担心,因为这通常意味着命令执行成功了。回想一下 1970 年代我们那些终端的网络连接有多慢,早期的程序员们认为,如果一切顺利,那还不如什么都不说,从而节省下几个宝贵的数据传输字节。
大小写的重要性 在命令行中输入时请特别注意大小写。输入 PWD 而不是 pwd 会产生一个错误,但有时错误的大小写会让一条命令看起来在运行,却没有做您所期待的事情。我们后面还会再谈到大小写,但目前,请务必完全按照所显示的大小写来输入下面所有的行。
方向感
现在来看这条命令本身。pwd 是 « p rint w orking d irectory 的缩写。它所做的全部事情,就是「打印」(显示)shell 当前的工作目录。那么什么是工作目录呢?
需要理解的一个重要概念是:shell 有一个默认位置的概念,所有文件操作都将在那里进行。这就是它的工作目录。如果您尝试创建新的文件或目录、显示已有的文件,甚至删除它们,除非您采取措施另行指定,否则 shell 都会假定您是在当前工作目录中查找它们。因此,随时清楚 shell 当前处在哪个目录是非常重要的,毕竟,在错误的目录中删除文件可能是灾难性的。如有疑问,pwd 命令会准确告诉您当前的工作目录是什么。
您可以使用 cd 命令来改变工作目录,它是下面这个词的缩写
« c hange d irectory»。试着输入以下内容:
cd /
pwd
请注意,目录分隔符是斜杠(「/」),而不是您在 Windows 或 DOS 系统中可能已经习惯的反斜杠
现在,您的工作目录是「/」。如果您来自 Windows 背景,可能已经习惯每个驱动器有自己的盘符,主硬盘通常是「C:」。类 Unix 系统不是这样划分磁盘的。相反,它们只有一个统一的文件系统,各个驱动器可以被挂接(「挂载」)到文件系统中任何最合适的位置。「/」目录,常被称为根目录(root),是这个统一文件系统的基础。从那里开始,其余的一切分支出去,构成一棵目录与子目录的树。
多个 root 请注意:虽然「/」目录有时被称为根目录,但「root」这个词还有另一个含义。root 也是自 Unix 诞生之初就用于超级用户的名称。超级用户,顾名思义,拥有比普通用户更大的权力,因此一条打错的命令就很容易造成严重破坏。我们将在第 7 节更详细地介绍超级用户账户。目前,您只需要知道「root」这个词在 Linux 世界里有多种含义,因此上下文很重要。
从根目录开始,下面这条命令会把您带到「home」目录(它是「/」的直接子目录):
cd home
pwd
要回到上一级的父目录,在这里就是回到「/」,请在切换目录时使用两个点这一特殊写法(..)(注意 cd 与 .. 之间的空格,与 DOS 不同,您不能把 cd .. 作为一条命令整体输入):
cd ..
pwd
单独输入 cd 是快速回到您个人主目录的一个捷径:
cd
pwd
如果您需要向上跨越多级父目录,也可以多次使用 ..:
cd ../..
pwd
相对路径与绝对路径
到目前为止我们看过的大多数例子都使用相对路径。也就是说,您最终到达的位置取决于您当前的工作目录。设想一下尝试 cd 进入「etc」文件夹。如果您已经在根目录中,这会顺利工作:
cd /
pwd
cd etc
pwd
但如果您处在自己的个人主目录中呢?
cd
pwd
cd etc
pwd
您会看到一条「没有那个文件或目录」的错误,甚至还来不及执行最后那条 pwd。通过指定目录名或使用 .. 来切换目录,其效果会因起点不同而不同。路径只有相对于您的工作目录才有意义。
但我们已经见过两条绝对命令。无论您当前的工作目录是什么,它们都会产生相同的效果。第一条,您单独执行 cd 直接进入自己的个人主目录。第二条,您使用 cd / 切换到根目录。事实上,任何以斜杠开头的路径都是绝对路径。您可以把它理解为在说「先切换到根目录,然后从那里沿着路线走」。这给了我们一个简单得多的方式来切换到 etc 目录,无论我们当前位于文件系统中的什么位置:
cd
pwd
cd /etc
pwd
这也给了我们另一种方式回到个人主目录,甚至回到它里面的文件夹。假设您想从磁盘上任何位置直接进入自己的「桌面」文件夹(注意大写的「D」)。在下面这条命令中,您需要把 USERNAME 换成您自己的用户名,如果不确定,whoami 命令会提醒您自己的用户名:
whoami
cd /home/USERNAME/Desktop
pwd
还有另一个像绝对路径一样工作的便捷写法。如您所见,在路径开头使用「/」表示「从根目录开始」。同样地,在路径开头使用波浪号字符(「~」)表示「从我的个人主目录开始」。
cd ~
pwd
您是否注意到,当您在文件系统中移动时,命令提示符前面显示的文字会发生变化?在 Ubuntu 系统上,它会显示您的用户名、计算机的网络名称以及当前的工作目录。但如果您位于个人主目录中的某个位置,它会用「~」作为简写。
小结 -> 让我们在文件系统里走一走,同时留意提示符的变化:
cd
cd /
cd ~
cd /etc
cd /var/log
cd ..
cd
到现在,单纯在文件系统里移动想必已经让您觉得相当枯燥了,但当我们进入创建新文件夹和文件的部分时,对绝对路径和相对路径的良好理解将是非常宝贵的。
4. 创建文件夹和文件
在本节中,我们将创建一些真正的文件来进行操作。为了避免不小心破坏您的某个真实文件,我们先创建一个新目录,让它远离您的个人文件夹,作为一个更安全的实验环境:
mkdir /tmp/tutorial
cd /tmp/tutorial
请注意这里使用了绝对路径,以确保我们是在 / tmp 中创建 tutorial 目录。如果开头没有斜杠,mkdir 命令就会尝试在当前工作目录中寻找一个 tmp 目录,然后尝试在它里面创建一个 tutorial 目录。如果找不到 tmp 目录,命令就会失败。
如果您还没有猜到,mkdir 是 « m a k e dir ectory» 的缩写。既然我们已经安全地待在测试区域里(不确定的话可以用 pwd 检查),那就来创建几个子目录:
mkdir dir1 dir2 dir3
这条命令有一点不同之处。到目前为止,我们只见过单独工作的命令(cd、pwd),或者后面只跟一个项目的命令(cd /、cd ~)。但这一次,我们在 mkdir 命令后面加了三样东西。这些东西被称为参数或实参,不同的命令可以接受不同数量的参数。mkdir 命令至少需要一个参数,而 cd 命令可以接受零个或一个,但不能更多。看看当您尝试给一条命令传递数量不正确的参数时会发生什么:
mkdir
cd /etc ~
回到我们新建的目录。上面的命令会在我们的文件夹中创建三个新的子目录。让我们用 ls 命令(l i s t)来看看它们:
ls
请注意,mkdir 是在同一个目录中创建了所有这些文件夹。它并没有把 dir3 创建在 dir2 里面、把 dir2 创建在 dir1 里面,也没有创建任何其他嵌套结构。但有时候恰恰需要这样做会很方便,而 mkdir 提供了一种办法:
mkdir -p dir4/dir5/dir6
ls
这一次,您会看到列表中只多出了 dir4,因为 dir5 位于它里面,而 dir6 又在 dir5 里面。稍后我们会安装一个有用的工具来查看这种结构,但您现在掌握的知识已经足以确认它了:
cd dir4
ls
cd dir5
ls
cd ../..
我们用到的「-p」被称为一个选项或开关(在这里,它的意思是「连同父文件夹一起创建」)。选项用于改变一条命令的工作方式,使同一条命令能够以不同的方式运行。遗憾的是,由于历史的偶然和人的习惯,选项在不同命令中可能有不同的形式。您经常会看到它们是前面带一个连字符的单个字符(就像这里这样),或者是前面带两个连字符的较长单词。单字符形式可以把多个选项组合在一起,不过并非所有命令都接受这种写法。更复杂的是,有些命令根本没有明确标识它们的选项,某样东西是不是选项,完全由参数的顺序决定!您不必操心所有这些可能性,只需知道选项是存在的,而且它们可以有多种不同的形式。
# Ne tapez pas ce qui suit, ceci est juste pour la démonstration
mkdir --parents --verbose dir4/dir5
mkdir -p --verbose dir4/dir5
mkdir -p -v dir4/dir5
mkdir -pv dir4/dir5
现在我们知道了,只要把多个目录作为分开的参数传给 mkdir 命令,就可以一次创建多个目录。但假设我们想创建一个名称中带空格的目录呢?来试试看:
mkdir another folder
ls
您大概不用真的输入这条命令,就能猜到会发生什么:两个新文件夹,一个叫 another,另一个叫 folder。如果您想在目录名或文件名中使用空格,就必须对它们进行转义。别担心,没有人要越狱;转义是一个计算机术语,指使用特殊代码告诉计算机以不同于平常的方式处理某些特定字符。请输入以下命令,尝试用不同的方式创建名称中带空格的文件夹:
mkdir "folder 1"
mkdir 'folder 2'
mkdir folder\ 3
mkdir "folder 4" "folder 5"
mkdir -p "folder 6"/"folder 7"
ls
虽然命令行确实可以用来处理名称中带空格的文件和文件夹,但必须用引号或反斜杠来转义它们,这让事情变得麻烦一些。您常常只凭文件名就能看出一个人是否经常使用命令行:他们往往只用字母和数字,并用下划线(「_」)或连字符(「-」)来代替空格。
使用重定向创建文件
我们的演示文件夹开始显得目录不少,但文件却有些欠缺。我们来纠正这一点,办法是把一条命令的输出重定向,让它不再打印到屏幕上,而是进入一个新文件。首先,回顾一下 ls 命令目前显示的内容:
ls
假设我们想把这条命令的输出保存成一个文本文件,以便查看或进一步处理。我们要做的只是在命令行的末尾加上大于号字符(「>」),后面跟上要写入的文件名:
ls > output.txt
这一次,屏幕上什么都没有打印出来,因为输出被重定向到了我们的文件里。如果您单独运行 ls,应该会看到 output.txt 文件已经被创建。我们可以用 cat 命令来查看它的内容:
cat output.txt
好吧,这与之前显示在屏幕上的内容并不完全相同,但它包含了同样的全部数据,而且是一种更便于后续处理的格式。我们再来看另一条命令,echo:
echo "This is a test"
是的,echo 只是把它的参数重新打印出来(名字也由此而来)。但把它与重定向结合起来,您就有了一种轻松创建小测试文件的办法:
echo "This is a test" > test_1.txt
echo "This is a second test" > test_2.txt
echo "This is a third test" > test_3.txt
ls
您应当对这些文件逐一使用 cat 来检查它们的内容。但 cat 不只是一个简单的文件查看器 - 它的名字来自「concatenate」,意思是「连接在一起」。如果您传给它多个文件名,这些文件会一个接一个地作为一整块文本显示出来:
cat test_1.txt test_2.txt test_3.txt
当您想把多个文件名传给同一条命令时,如果这些文件名称相似,有一些有用的简写可以省去大量输入。问号(「?」)可以用来表示文件名中的「任意单个字符」。星号(「*」)可以用来表示「零个或多个字符」。后者有时被称为「通配」字符。举几个例子会有帮助,下面这些命令做的都是同一件事:
cat test_1.txt test_2.txt test_3.txt
cat test_?.txt
cat test_*
未完待续..
