如果您是 UNIX 和 Linux 的新手,您可能会被系统庞大的规模和看似的复杂性所吓倒。本章不会深入探讨或涵盖高级主题。相反,我们希望您能够快速上手。
我们在这里假设您对计算机系统的背景知识很少,也许您只熟悉个人计算机系统和 MS-DOS。但是,即使您不是 MS-DOS 用户,您也应该能够理解这里的所有内容。乍一看,Linux 看起来很像 MS-DOS——毕竟,MS-DOS 的部分内容是模仿 CP/M 操作系统建模的,而 CP/M 操作系统又是模仿 UNIX 建模的。然而,Linux 只有最表面的特征与 MS-DOS 相似。即使您完全不熟悉 PC 世界,本教程也应该有所帮助。
并且,在我们开始之前:不要害怕尝试。 系统不会咬你。您不会因为在系统上工作而破坏任何东西。Linux 具有内置的安全功能,可以防止“普通”用户损坏对系统至关重要的文件。即便如此,可能发生的最糟糕的事情是您可能会删除部分或全部文件,并且您必须重新安装系统。所以,在这一点上,您没有什么可失去的。
Linux 是一个多任务、多用户操作系统,这意味着许多人可以在同一台计算机上同时运行许多不同的应用程序。这与 MS-DOS 不同,在 MS-DOS 中,一次只能有一个人使用系统。在 Linux 下,要向系统标识您的身份,您必须登录,这需要输入您的登录名(系统用来标识您的名称)和输入您的密码,这是您登录帐户的个人密钥。因为只有您知道您的密码,所以其他人无法以您的用户名登录系统。
在传统的 UNIX 系统上,系统管理员会在您获得系统帐户时为您分配用户名和初始密码。但是,由于在 Linux 中您是系统管理员,因此您必须先设置自己的帐户才能登录。在以下讨论中,我们将使用虚构的用户名,“larry.''
此外,每个系统都有一个分配给它的 主机名。正是这个主机名赋予您的机器一个名称,赋予它个性和魅力。主机名用于标识网络上的各个机器,但即使您的机器未联网,它也应该有一个主机名。在下面的示例中,系统的主机名为“mousehouse''.
在您可以使用新安装的 Linux 系统之前,您必须为自己设置一个用户帐户。通常不建议使用root帐户进行正常使用;您应该保留root帐户,用于运行特权命令和维护系统,如下所述。
为了为自己创建一个帐户,请以root身份登录,并使用useradd或adduser命令。有关此过程的信息,请参阅第 4.6 节。
输入您的用户名并按 Enter 键。我们的英雄,larry,将输入
接下来,输入您的密码。您输入的字符不会回显到屏幕上,因此请仔细输入。如果您输错了密码,您将看到消息
并且您必须重试。
一旦您正确输入了用户名和密码,您就正式登录到系统,并且可以自由漫游。
系统的控制台是直接连接到系统的显示器和键盘。(由于 Linux 是一个多用户操作系统,您可能还有其他终端连接到系统上的串行端口,但这些不是控制台。)Linux,像其他一些版本的 UNIX 一样,提供了对虚拟控制台(或 VC)的访问,这使您可以在控制台上同时拥有多个登录会话。
为了演示这一点,请登录到您的系统。接下来,按 Alt-F2。您应该会再次看到login提示符。您正在查看第二个虚拟控制台。要切换回第一个 VC,请按 Alt-F1。瞧! 您回到了您的第一个login会话。
新安装的 Linux 系统可能只允许您通过按 Alt-F1 到 Alt-F4,或系统上配置的 VC 数量来访问前几个 VC。可以启用最多 12 个 VC——键盘上的每个功能键对应一个 VC。如您所见,VC 的使用可能非常强大,因为您可以同时在多个不同的会话中工作。
虽然使用 VC 有些局限性(毕竟,您一次只能查看一个 VC),但它应该让您感受到 Linux 的多用户功能。当您在第一个 VC 上工作时,您可以切换到第二个 VC 并处理其他事情。
对于您在 Linux 世界中的大多数探索,您将通过 shell 与系统对话,shell 是一个程序,它接受您键入的命令并将它们转换为操作系统的指令。这可以与 MS-DOS 下的COMMAND.COM程序相比较,该程序的功能基本相同。shell 只是 Linux 的一个接口。有许多可能的接口——例如 X Window 系统,它允许您使用鼠标和键盘运行命令。
一旦您登录,系统就会启动 shell,您可以开始输入命令。这是一个简单的例子。Larry 登录并等待 shell 提示符。
此文本的最后一行是 shell 的提示符,指示它已准备好接受命令。(稍后会详细介绍提示符本身的含义。)让我们尝试告诉系统做一些有趣的事情
嗯,事实证明,make是系统上的一个实际程序名称,shell 在给出命令时执行了这个程序。(不幸的是,系统不太友好。)
这引出了我们迫切想知道的问题:什么是命令?当您键入“make love”时会发生什么?命令行上的第一个词,“makemake
”,是要执行的命令的名称。命令行上的所有其他内容都作为此命令的参数。例子此命令的名称是“cp”,参数是“foo”和“''.
bar
”。当您输入命令时,shell 会执行几个操作。首先,它检查命令以查看它是否是 shell 内部的命令。(也就是说,shell 知道如何自己执行的命令。有很多这样的命令,我们稍后会介绍它们。)shell 还会检查命令是否是别名,或者另一个命令的替代名称。如果这些条件都不适用,shell 会在磁盘上查找具有指定名称的程序。如果成功,shell 会运行该程序,并发送命令行上指定的参数。make在我们的示例中,shell 会查找名为make. 的程序,并使用参数lovemake love运行它。makeMakemake是一个经常用于编译大型程序的程序,并将要编译的“目标”的名称作为参数。在“makemake love
”的情况下,我们指示
make编译目标love。因为makemake love'').
如果我们向 shell 输入一个命令,而 shell 找不到具有指定名称的程序,会发生什么情况?好吧,我们可以尝试以下操作
很简单,如果 shell 找不到具有命令行上给定名称的程序(这里是“
”),它会打印一条错误消息。如果您输错了命令(例如,如果您输入了“mkae love”而不是“
”),您经常会看到此错误消息。
3.2.5 注销。 在我们深入探讨之前,我们应该告诉您如何注销系统。在 shell 提示符下,使用命令exit/注销。还有其他注销方法,但这是最万无一失的方法。
3.2.6 更改密码。
您还应该知道如何更改密码。命令passwd提示您输入旧密码和新密码。它还会要求您重新输入新密码以进行验证。小心不要忘记您的密码——如果您忘记了,您将不得不请系统管理员为您重置密码。(如果您是系统管理员,请参阅第 页。)3.2.7 文件和目录。, 在大多数操作系统(包括 Linux)下,都有文件的概念,它只是给定名称(称为文件名)的信息束。文件的示例可能是您的历史学期论文、电子邮件或可以执行的实际程序。本质上,保存在磁盘上的任何内容都保存在单个文件中。 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名history-paper保存。这些名称通常以对您有意义的某种形式标识文件及其内容。文件名没有像 MS-DOS 和其他一些操作系统那样的标准格式;一般来说,文件名可以包含任何字符(除了 在大多数操作系统(包括 Linux)下,都有文件的概念,它只是给定名称(称为文件名)的信息束。文件的示例可能是您的历史学期论文、电子邮件或可以执行的实际程序。本质上,保存在磁盘上的任何内容都保存在单个文件中。/
字符——请参阅下面的路径名讨论),长度限制为 256 个字符。/ 随着文件的概念,出现了目录的概念。目录是文件的集合。它可以被认为是包含许多不同文件的“文件夹”。目录被赋予名称,您可以使用这些名称来标识它们。此外,目录以树状结构维护;也就是说,目录可以包含其他目录。/ 因此,您可以通过其路径名来引用文件,路径名由文件名组成,前面是包含该文件的目录的名称。例如,假设 Larry 有一个名为
paperspasswd的目录,其中包含三个文件history-finalenglish-lithistory-final和masters-thesis。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用history-final文件,Larry 可以指定文件的路径名,如history-final/home/larry/papers/history-final
如您所见,目录和文件名用单个斜杠 (passwd/history-final) 分隔。因此,文件名本身不能包含
字符。MS-DOS 用户会发现这种约定很熟悉,尽管在 MS-DOS 世界中,使用反斜杠 (\
) 代替。/ 如前所述,目录也可以相互嵌套。例如,假设在/papers中还有另一个目录,名为, notes, 。“ 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名notes”目录包含文件
math-noteshistory-final。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用3.2.7 文件和目录。和cheat-sheet。文件cheat-sheet.
的路径名将是
/home/larry/papers/notes/cheat-sheet
因此,路径名实际上就像文件的路径。包含给定子目录的目录称为父目录。在这里,目录
papers
notescheat-sheet目录的父目录。
3.2.8 目录树。passwd 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名passwd 大多数 Linux 系统对文件使用标准布局,以便可以轻松定位系统资源和程序。此布局形成一个目录树,该目录树以“3.2.7 文件和目录。/
”目录开始,也称为“根目录”。在/下直接是重要的子目录cheat-sheet/bin
/etc/dev/usr/等等。这些目录又包含其他目录,这些目录包含系统配置文件、程序等等。
特别是,每个用户都有一个主目录,这是为该用户预留的用于存储其文件的目录。在上面的示例中,Larry 的所有文件(如//home/larry/papers/history-final/)都包含在 Larry 的主目录中。通常,用户主目录包含在
下,并以拥有该目录的用户的名字命名。Larry 的主目录是/home/larry。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。=1.0pt~
图 3.1: 典型的(简略的)Linux 目录树。
3.2.9 当前工作目录。~ 在任何时候,您输入的命令都假定相对于您的当前工作目录。您可以将您的工作目录视为您当前“位于”的目录。当您第一次登录时,您的工作目录设置为您的主目录——
/home/larry,在我们的例子中。每当您引用文件时,您都可以相对于您的当前工作目录来引用它,而不是指定文件的完整路径名。这是一个例子。Larry 有目录/home/larry/papers,其中包含文件/home/larry/papers/history-final。如果 Larry 想要查看此文件,他可以使用命令~more /home/larry/papers/history-final
moremake命令只是每次显示一个屏幕的文件。但是,由于 Larry 的当前工作目录是的程序,并使用参数或/home/larry,他可以使用命令
/以外的字符开始文件名(如papers/final以外的字符开始文件名(如),则您指的是相对于当前工作目录的文件。这被称为相对路径名。
另一方面,如果您以
/passwd开始文件名,则系统将其解释为完整路径名——也就是说,包含到文件的完整路径的路径名,从根目录
/passwd开始。这被称为绝对路径名。
3.2.10 引用主目录。passwd 在
tcsh以外的字符开始文件名(如和..bash.. 下,您可以使用波浪号字符 (.~
) 指定您的主目录。例如,命令
more ~/papers/history-final以外的字符开始文件名(如等同于以外的字符开始文件名(如more /home/larry/papers/history-final
您还可以使用波浪号字符指定其他用户的主目录。路径名~karl/lettersenglish-lit~karl/letters被 shell 转换为
/home/karl/letters(如果, /home/karl 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名passwd是 karl 的主目录)。使用波浪号只是一个快捷方式;没有名为~的目录——这只是 shell 提供的语法糖。~karl/letters3.3 Linux 初步。
在我们开始之前,重要的是要知道 Linux 系统上的所有文件和命令名称都是区分大小写的(与 MS-DOS 等操作系统不同)。例如,命令/make
与MAKE非常不同。文件和目录名称也是如此。*3.3.1 移动。MAKE现在您可以登录,并且您知道如何使用路径名引用文件,您如何更改当前工作目录以使生活更轻松?
在目录结构中移动的命令是-cd~,它是“更改目录”的缩写。许多常用的 Linux 命令都是两到三个字母。命令~cd~karl/letters的用法是/其中directory 是您希望成为当前工作目录的目录名称。
如前所述,当您登录时,您从您的主目录开始。如果 Larry 想要切换到~karl/letterspapers
子目录,他将使用命令notes) 分隔。因此,文件名本身不能包含
cd papers
。如您所见,Larry 的提示符会更改以反映他的当前工作目录(以便他知道他在哪里)。现在他进入了
papers目录,他可以使用命令.
more history-final~karl/letters。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用以外的字符开始文件名(如 查看他的历史期末论文。现在,Larry 陷入了papers子目录。要向上移动到下一个更高层(或父)目录,请使用命令~karl/letters或以外的字符开始文件名(如cd ..
cd”和“..
”之间的空格。)每个目录都有一个名为“
”的条目,它引用父目录。同样,每个目录都有一个名为“此命令的名称是“.
”目录开始,也称为“根目录”。在此命令的名称是“”的条目,它引用自身。因此,命令.cd .
您还可以将绝对路径名与cd命令一起使用。要
cd到 Karl 的主目录,我们可以使用命令cd /home/karl。此外,使用cdcd不带参数将使您返回到您自己的主目录。
3.3.2 查看目录内容。 cd。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用此命令的名称是“ 现在您知道了如何在目录中移动,您可能会想,“那又怎样?” 仅在目录中移动本身是相当无用的,所以让我们介绍一个新命令,
命令显示文件和目录的列表,默认情况下来自您的当前目录。例如~karl/letterslsMail papers letters在这里我们可以看到 Larry 的当前目录中有三个条目
MailMail papers letterspapers
lettersMail papers letters。这并没有告诉我们太多——这些是目录还是文件?我们可以使用-F选项的-Fls
ls -F/。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用Mail/ papers/ letters/从附加到每个文件名的//Mail/ papers/ letters/,我们知道这三个条目实际上是子目录。
*ls -F”,这将指示该文件是可执行文件,或者可以运行的程序。如果使用ls -F, 时文件名后没有附加任何内容,则该文件是“普通旧文件”,也就是说,它既不是目录也不是可执行文件。 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名一般来说,每个 UNIX 命令都可能采用许多选项以及其他参数。这些选项通常以“-
”开头,如上面的/-F/选项所示。/.
-F/选项告诉ls提供有关所涉及文件类型的更多信息——在本例中,在每个目录名称后打印一个Mail/ papers/ letters//Mail/ papers/ letters/。
ls
一个目录名,系统将打印该目录的内容。ls /etc或者,为了获得更有趣的列表,让我们看看系统~karl/letters/etc
中有什么。如果您是 MS-DOS 用户,您可能会注意到文件名可以超过 8 个字符,并且可以在任何位置包含句点。您甚至可以在文件名中使用多个句点。~karl/letters让我们移动到目录树的顶部,然后使用命令向下移动到另一个目录
cd /
lsls /etccd usr以外的字符开始文件名(如ls以外的字符开始文件名(如您也可以一步移动到目录中,例如
尝试在各种目录中移动,使用
ls。在某些情况下,您可能会遇到不祥的“Permission denied
”错误消息。这仅仅是 UNIX 安全性的启动:为了使用cd和
ls命令,您必须具有执行此操作的权限。我们将在第 页 开始详细讨论这一点。Permission denied
3.3.3 创建新目录。 是时候学习如何创建目录了。这涉及到mkdir命令的使用。尝试以下操作mkdir testdir命令的使用。尝试以下操作cd testdir命令,您必须具有执行此操作的权限。我们将在第 页 开始详细讨论这一点。恭喜!您创建了一个新目录并进入了该目录。由于这个新目录中没有任何文件,让我们学习如何将文件从一个地方复制到另一个地方。3.3.4 复制文件。.
,如下所示cp /etc/termcap ., 命令将命令行上列出的文件复制到作为最后一个参数给出的文件或目录。请注意,我们使用“ 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名.”来引用当前目录。
3.3.5 移动文件。
mv
命令移动文件,而不是复制文件。语法非常简单-mv termcap sells-lssells请注意,termcap.
文件已重命名为ls /etcsells
。您还可以使用此命令的名称是“mv
注意
mv
会覆盖同名的目标文件,而不会询问您。当您将文件移动到另一个目录时要小心。该目录中可能已经存在同名的文件,您将覆盖它!3.3.6 删除文件和目录。 现在您使用MAKE要显示其内容的列表。您可能会看到以下目录bin, dev, etc, home, install, lib,
mnt, proc, root, tmp, user, usr 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名var.
现在,让我们看看这些目录中的每一个。
上面描述的各种目录对于系统的运行至关重要,但大多数在notes中找到的项目是可选的。然而,正是这些可选项目使系统变得有用且有趣。如果没有notes,您将拥有一个无聊的系统,仅支持像此命令的名称是“。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用~karl/letters. notes这样的程序,其中包含大多数较大的软件包以及随附的配置文件。
如前所述,Linux 是一个多任务、多用户的操作系统。多任务非常有用,一旦您理解了它,您将一直使用它。不久之后,您将在后台运行程序、在任务之间切换以及将程序管道连接在一起,以使用单个命令实现复杂的结果。
我们将在本节中介绍的许多功能是由 shell 本身提供的功能。注意不要将 Linux(实际的操作系统)与 shell 混淆——shell 只是底层系统的接口。除了 Linux 本身之外,shell 还提供了额外的功能。
Shell 不仅是您在提示符下键入的交互式命令的解释器,而且还是一个强大的编程语言。它允许您编写shell 脚本,将多个 shell 命令“批处理”到一个文件中。如果您了解 MS-DOS,您会认识到它与“批处理文件”的相似之处。Shell 脚本是一个非常强大的工具,可以让您自动化和扩展您对 Linux 的使用。有关更多信息,请参见 页。
在 Linux 世界中有几种类型的 shell。“Bourne shell”和“C shell”是两种主要的类型。Bourne shell 使用类似于早期 UNIX 系统(如 System III)上的原始 shell 的命令语法。在大多数 Linux 系统上,Bourne shell 的名称是ls -F(其中sh代表“shell”)。C shell(不要与海贝壳混淆)使用不同的语法,有点像编程语言 C,在大多数 Linux 系统上,它的名称是一般来说,每个 UNIX 命令都可能采用许多选项以及其他参数。这些选项通常以“.
在 Linux 下,可以使用这些 shell 的几种变体。最常用的两种是 Bourne Again Shell,或“Bash”(时文件名后没有附加任何内容,则该文件是“普通旧文件”,也就是说,它既不是目录也不是可执行文件。),和“Tcsh”(/bin/tcsh). 第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。是 Bourne shell 的一种形式,它包含了 C shell 中的许多高级功能。因为第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。支持 Bourne shell 语法的超集,所以用标准 Bourne shell 编写的 shell 脚本应该可以与第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。一起使用。如果您喜欢使用 C shell 语法,Linux 支持/home/larry,它是原始 C shell 的扩展版本。
您决定使用的 shell 类型主要是一个宗教问题。有些人喜欢带有第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。高级功能的 Bourne shell 语法,有些人则更喜欢结构化的 C shell 语法。就诸如此命令的名称是“。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用~karl/letters之类的普通命令而言,您使用的 shell 并不重要——语法是相同的。只有当您开始编写 shell 脚本或使用 shell 的高级功能时,shell 类型之间的差异才开始变得重要。
当我们讨论各种 shell 的功能时,我们将注意到 Bourne shell 和 C shell 之间的差异。但是,就本手册而言,大多数差异都是微不足道的。(如果您现在真的好奇,请阅读第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用/home/larry).
大多数 Linux shell 的一个关键功能是能够使用特殊字符按名称引用多个文件。这些通配符让您可以引用,例如,所有文件名中包含字符“n''.
通配符“*”指定文件名中的任何字符或字符串。当您在文件名中使用字符“*”时,shell 会将其替换为您正在引用的目录中文件名的所有可能替换项。
这是一个快速示例。假设 Larry 的当前目录中有文件frog,
joe 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名stuff。
要指定所有文件名中包含字母“o”的文件,请使用命令
正如您所看到的,每个“*”的实例都被替换为当前目录中文件名中与通配符匹配的所有替换项。
单独使用“*”只是匹配所有文件名,因为所有字符都与通配符匹配。
以下是更多示例
将“*”更改为一系列文件名的过程称为通配符扩展,它由 shell 完成。这很重要:单个命令,例如~karl/letters,永远不会在其参数列表中看到“*”。shell 会扩展通配符以包含所有匹配的文件名。因此,命令
被 shell 扩展为
关于“*”通配符的一个重要注意事项:它不匹配以单个句点(“..”)开头的文件名。这些文件被视为隐藏文件——虽然它们不是真正隐藏的,但它们不会出现在正常的~karl/letters列表中,也不会被“*”通配符触及。
这是一个例子。我们之前提到过,每个目录都包含两个特殊条目:“..” 指的是当前目录,“....” 指的是父目录。但是,当您使用~karl/letters时,这两个条目不会显示出来。
如果您使用-a开关与~karl/letters一起使用,您可以显示以“..”开头的文件名。观察
该列表包含两个特殊条目“.foo
...”和“..”,以及另外两个“隐藏”文件——.bash_profile。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用.bashrc。这两个文件是第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。在larry登录时使用的启动文件。它们从
页开始描述。
请注意,当您使用“*”通配符时,以“..”开头的文件名都不会显示。
这是一个安全功能:如果“*”通配符匹配以“..”开头的文件名,它也会匹配目录名“.foo...”。当使用某些命令时,这可能很危险。
另一个通配符是“??”。“??”通配符仅扩展为单个字符。因此,“ls ?”显示所有单字符文件名。而“ls termca?”将显示“到 Karl 的主目录,我们可以使用命令termcap”,但不显示“termcap.backup
”。这是另一个例子此命令的名称是“。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用cd正如您所看到的,通配符允许您一次指定多个文件。在从 页开始的命令摘要中,我们说过
命令实际上可以一次复制或移动多个文件。例如,notes将中所有以“scheat-sheet”开头的文件名复制到目录此命令的名称是“。的格式
命令实际上是cd,其中 files 列出了要复制的文件名,destination 是目标文件或目录。
具有相同的语法。
如果要复制或移动多个文件,destination 必须是目录。您只能将单个文件复制或移动到另一个文件。
3.9.1 标准输入和标准输出。 许多 Linux 命令从所谓的标准输入获取输入,并将它们的输出发送到标准输出(通常缩写为。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用stdinstdout
)。您的 shell 设置使标准输入是您的键盘,标准输出是屏幕。Mail/ papers/ letters/这是一个使用Mail/ papers/ letters/命令的示例。通常,stdin从命令行指定的所有文件中读取数据,并将此数据直接发送到
。因此,使用命令3.2.7 文件和目录。显示文件history-paper.
的内容,后跟Mail/ papers/ letters/。但是,如果您没有指定文件名, 许多 Linux 命令从所谓的标准输入获取输入,并将它们的输出发送到标准输出(通常缩写为会从stdin读取数据并将其发送回
。这是一个例子Mail/ papers/ letters/ 您键入的每一行都会立即被
回显。当从标准输入读取时,您通过发送 EOT(文本结束)信号来指示输入“已完成”,通常,这可以通过按 Ctrl-D 生成。这是另一个例子。命令读取文本行(同样,来自 stdin,除非您指定一个或多个文件名),并将排序后的输出发送到 stdout。尝试以下操作。
现在我们可以按字母顺序排列我们的购物清单了……Linux 是不是很有用?
现在,假设您想将这是另一个例子。的输出发送到一个文件,以便将我们的购物清单保存在磁盘上。shell 允许您使用“>”符号将标准输出重定向到文件名。这是它的工作原理
正如您所看到的,这是另一个例子。命令的结果没有显示,而是保存到名为shopping-list的文件中。让我们看看这个文件
现在您可以对购物清单进行排序并保存它!但是,假设您将未排序的原始购物清单存储在文件items中。一种对信息进行排序并将其保存到文件的方法是给这是另一个例子。要读取的文件名,而不是标准输入,并像我们上面所做的那样重定向标准输出,如下所示
但是,还有另一种方法可以做到这一点。您不仅可以重定向标准输出,还可以使用“<”符号重定向标准输入。
从技术上讲,sort < items图 3.1: 典型的(简略的)Linux 目录树。与相同,但让您演示以下观点sort < items的行为就像文件items中的数据被键入到标准输入一样。shell 处理重定向。这是另一个例子。没有给出要读取的文件名 (items);就这是另一个例子。而言,它仍然像您从键盘键入数据一样从标准输入读取。
这引入了过滤器的概念。过滤器是一个从标准输入读取数据,以某种方式处理它,并将处理后的数据发送到标准输出的程序。使用重定向,可以从文件中引用标准输入和标准输出。如上所述, 许多 Linux 命令从所谓的标准输入获取输入,并将它们的输出发送到标准输出(通常缩写为。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用stdin分别默认为键盘和屏幕。这是另一个例子。是一个简单的过滤器。它对传入的数据进行排序,并将结果发送到标准输出。Mail/ papers/ letters/甚至更简单。它不对传入的数据做任何事情,只是输出给它的任何东西。
我们已经演示了如何使用这是另一个例子。作为过滤器。但是,这些示例假设您在某个地方的文件中存储了数据,或者愿意自己从标准输入键入数据。如果您想要排序的数据来自另一个命令的输出,比如~karl/letters?
”目录开始,也称为“根目录”。在-r选项来这是另一个例子。以反向字母顺序对数据进行排序。如果您想以反向顺序列出当前目录中的文件,一种方法是按如下方式操作
现在将~karl/letters命令的输出重定向到一个名为file-list:
的文件中。在这里,您将~karl/letters的输出保存在一个文件中,然后运行sort -r在该文件上。但这很笨拙,并且使用了临时文件来保存来自~karl/letters.
的数据。解决方案是管道。这是一种 shell 功能,它通过“管道”连接一系列命令。stdin第一个命令的 许多 Linux 命令从所谓的标准输入获取输入,并将它们的输出发送到标准输出(通常缩写为被发送到第二个命令的stdin。在这种情况下,我们想将~karl/letters的 许多 Linux 命令从所谓的标准输入获取输入,并将它们的输出发送到标准输出(通常缩写为。在这种情况下,我们想将这是另一个例子。发送到|。使用“
”符号创建管道,如下所示
此命令更短且更易于键入。
这是另一个有用的示例,命令/显示一个长长的文件列表,其中大多数文件滚动速度太快,您无法阅读。因此,让我们使用来显示.
/usr/bin
中的文件列表。现在您可以悠闲地向下翻页浏览文件列表了。但乐趣不止于此!您可以将两个以上的命令通过管道连接在一起。命令head
是一个过滤器,它显示来自输入流的前几行(在本例中,来自管道的输入)。如果您想显示当前目录中按字母顺序排列的最后一个文件名,请使用如下命令其中head -1~karl/letters显示它接收到的第一行输入(在本例中,来自
输出的非破坏性重定向。> 使用“
”将输出重定向到文件是破坏性的:换句话说,命令file-list会覆盖文件>>的内容。相反,如果您使用符号“
”,则输出将附加到(添加到末尾)指定的文件,而不是覆盖它。例如,~karl/letters将file-list.
命令的输出附加到>'', ``>>foo |请记住,重定向和管道是 shell 的功能——它支持使用“
”。它与命令本身无关。
3.10 文件权限。
3.10.1 文件权限的概念。
因为 Linux 系统上通常有多个用户,所以 Linux 提供了一种称为文件权限的机制,以保护用户文件免受其他用户的篡改。此机制允许文件和目录由特定用户“拥有”。例如,由于 Larry 在他的主目录中创建了文件,因此 Larry 拥有这些文件并可以访问它们。
Linux 还允许用户和用户组之间共享文件。如果 Larry 愿意,他可以切断对其文件的访问,以便没有其他用户可以访问它们。但是,在大多数系统上,默认设置是允许其他用户读取您的文件,但不以任何方式修改或删除它们。
每个文件都由特定用户拥有。但是,文件也由特定的组拥有,该组是系统用户的已定义组。每个用户在创建用户帐户时至少被放入一个组。但是,系统管理员可能会授予用户访问多个组的权限。 组通常由访问计算机的用户类型定义。例如,在大学 Linux 系统上,用户可以被放入组, student, staff或facultyguestbin。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用。还有一些系统定义的组(例如admin
),系统本身使用这些组来控制对资源的访问——实际用户很少属于这些系统组。
权限分为三个主要部分:读取、写入和执行。这些权限可以授予三类用户:文件所有者、文件所属的组以及所有用户(无论组如何)。~karl/letters 读取权限允许用户读取文件的内容,或者在目录的情况下,列出目录的内容(使用以外的字符开始文件名(如)。写入权限允许用户写入和修改文件。对于目录,写入权限允许用户在该目录中创建新文件或删除文件。最后,执行权限允许用户将文件作为程序或 shell 脚本运行(如果文件是程序或 shell 脚本)。对于目录,拥有执行权限允许用户
3.10.2 解释文件权限。~karl/letters 让我们看一个演示文件权限的例子。将命令与-l
选项一起使用会显示文件的“长”列表,包括文件权限。larry列表中第一个字段表示文件权限。第三个字段是文件的所有者(),第四个字段是文件所属的组(usersstuff)。显然,最后一个字段是文件名(
)。我们稍后将介绍其他字段。larry此文件由),第四个字段是文件所属的组(拥有,并且属于组。字符串-rw-r-r-
按顺序列出了授予文件所有者、文件组和所有其他人的权限。-权限字符串的第一个字符(“-d”)表示文件类型。“”表示这是一个常规文件(与目录或设备驱动程序相对)。接下来的三个字符(“larryrw-”)表示授予文件所有者的权限。“r”代表“读取”,而“larrywstuff.
”代表“写入”。因此,对文件具有读取和写入权限。如前所述,除了读取和写入权限外,还有“执行”权限——用“-x对文件”表示。但是,这里列出了“stuff”,而不是“
”,因此 Larry 对此文件没有执行权限。这很好,因为文件不是任何类型的程序。当然,由于 Larry 拥有该文件,他可以根据需要授予自己该文件的执行权限。(这将在稍后介绍。)接下来的三个字符(“),第四个字段是文件所属的组(r-”)表示授予文件所有者”)表示组对文件的权限。拥有此文件的组是),第四个字段是文件所属的组(。因为这里只出现了一个“
”,所以属于组不是任何类型的程序。当然,由于 Larry 拥有该文件,他可以根据需要授予自己该文件的执行权限。(这将在稍后介绍。)的任何用户都可以读取此文件。),第四个字段是文件所属的组(最后三个字符,也是(“”)表示授予文件所有者r--
”),表示授予系统上每个其他用户(文件所有者和组
”,所以其他用户可以读取该文件,但不能写入或执行它。以下是一些其他权限示例3.10.3 权限依赖性。cheat-sheet 授予文件的权限还取决于文件所在目录的权限。例如,即使文件设置为-rwxrwxrwx,其他用户也无法访问该文件,除非他们对该文件所在的目录具有读取和执行访问权限。例如,如果 Larry 想限制对其所有文件的访问,他可以将他的主目录
的权限设置为
-rwx---。字符串。这样,没有其他用户可以访问他的目录以及其中的所有文件和目录。Larry 无需担心他每个文件的个别权限。换句话说,要访问文件,您必须对文件路径名上的所有目录具有执行访问权限,并对文件本身具有读取(或执行)访问权限。通常,Linux 系统上的用户对其文件非常开放。授予文件的常用权限集是
-rw-r--r--,这允许其他用户读取文件,但不以任何方式更改它。授予目录的常用权限集是-rwxr-xr-x-rwxrwxrwx,这允许其他用户浏览您的目录,但不能在其中创建或删除文件。
-rw-------将阻止任何其他用户访问该文件。同样,将目录的权限设置为-rwx------将阻止任何其他用户访问该文件。同样,将目录的权限设置为。这并没有告诉我们太多——这些是目录还是文件?我们可以使用
会将其他用户排除在有问题的目录之外。+3.10.4 更改权限。- 命令
chmod
简而言之,您提供 all、user、group 或 other 中的一个或多个。然后,您指定是要添加权限(
-)。最后,您指定 read、write 和 execute 中的一个或多个。一些合法命令的示例是 3.11 管理文件链接。”,参数是“ 链接允许您给单个文件提供多个名称。文件实际上由系统通过它们的 inode 号标识,inode 号只是文件的唯一文件系统标识符。目录实际上是 inode 号及其对应文件名的列表。目录中的每个文件名都是指向特定 inode 的链接。3.11.1 硬链接。
命令用于为一个文件创建多个链接。例如,假设您有一个名为”,参数是“的文件在一个目录中。使用”,参数是“,您可以查看此文件的 inode 号。”和“在这里,
在文件系统中的 inode 号为 22192。您可以创建另一个指向3.11.1 硬链接。的链接,名为
,如下所示”,参数是“或”和“使用”,参数是“,您会看到这两个文件具有相同的 inode。”和“现在,指定”,参数是“。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用”和“或
都将访问同一个文件。如果您对
进行更改,这些更改也会出现在Mail papers letters中。出于所有目的,
和”,参数是“是同一个文件。”和“这些链接被称为硬链接,因为它们创建了到 inode 的直接链接。请注意,只有当硬链接文件位于同一文件系统上时,才能进行硬链接;符号链接(见下文)没有此限制。Mail papers letters当您使用Mail papers letters删除文件时,您实际上只是删除到文件的链接之一。如果您使用命令
,那么只有名为的链接被删除,仍然存在。只有当文件没有指向它的链接时,该文件才会在系统上真正被删除。通常,文件只有一个链接,因此使用
命令会删除该文件。但是,如果文件有多个链接指向它,使用2将仅删除单个链接;为了删除文件,您必须删除指向该文件的所有链接。
命令.显示文件的链接数(以及其他信息)。..列表中的第二列“/) ``..”指定文件的链接数。/事实证明,目录实际上只是一个包含链接到 inode 关联信息的文件。此外,每个目录至少包含两个硬链接:“
..”(指向父目录的链接)。根目录(
“/”)的“”链接只是指回。(换句话说,根目录的父目录是根目录本身。)
3.11.2 符号链接。”和“ 符号链接,或 symlink,是另一种类型的链接,它与硬链接不同。符号链接允许您给文件另一个名称,但不会通过 inode 链接文件。”,参数是“命令3.11.1 硬链接。创建一个指向文件的符号链接。例如,如果您使用命令
,您将创建一个名为的链接被删除,的符号链接,该链接指向文件”和“。如果您使用”,参数是“.
,您会看到这两个文件确实具有不同的 inode。但是,使用,我们看到文件”,参数是“).
是一个指向
的符号链接。符号链接上的文件权限未使用(它们始终显示为rwxrwxrwx)。相反,符号链接上的权限由符号链接目标的权限确定(在我们的示例中,文件
/lib
中的共享库映像尤其重要。有关更多信息,请参见 页。 第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用/home/larry3.12 作业控制。
3.12.1 作业和进程。 作业控制是许多 shell(包括
)提供的一项功能,它允许您一次控制多个正在运行的命令或作业。在我们深入探讨之前,我们需要谈谈进程。 每次运行程序时,您都会启动所谓的进程。命令ps显示当前正在运行的进程列表,如下所示 第一列中列出的PID是进程 ID,它是分配给每个正在运行的进程的唯一编号。最后一列,第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。COMMAND ,是正在运行的命令的名称。在这里,我们只查看 Larry 自己当前正在运行的进程。(系统上还有许多其他进程在运行——“第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。ps -aux ”列出了所有进程。)这些是第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。(Larry 的 shell)和 命令本身。正如您所看到的, 与第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。命令同时运行。
在 Larry 键入命令时执行了
。在
完成运行后(在显示进程表之后),控制权返回到
正在运行的进程也称为作业。术语进程和作业是可互换的。但是,当进程与 作业控制(shell 的一项功能,允许您在多个独立作业之间切换)结合使用时,进程通常被称为“作业”。
在大多数情况下,用户一次只运行一个作业——他们上次键入到 shell 的任何命令。但是,使用作业控制,您可以一次运行多个作业,并根据需要在其间切换。
这可能有什么用呢?假设您正在编辑一个文本文件,并想中断编辑并做其他事情。通过作业控制,您可以暂时挂起编辑器,返回到 shell 提示符并开始处理其他事情。完成后,您可以切换回编辑器,回到您开始的地方,就好像您没有离开编辑器一样。作业控制还有许多其他实际用途。
3.12.2 前台和后台。
有些作业需要很长时间才能完成,并且在运行时不会做任何有趣的事情。编译程序就是这样一项作业,压缩大型文件也是如此。没有理由在这些作业完成任务时无聊地坐着;只需在后台运行它们即可。当作业在后台运行时,您可以自由运行其他程序。 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。 挂起作业不等于中断作业。当您中断正在运行的进程(通过按下中断键,通常是 Ctrl-C)时,该进程将被永久终止。一旦作业被终止,就无法恢复它了。您必须再次运行该命令。此外,某些程序会捕获中断,因此按 Ctrl-C 不会立即终止作业。这是为了让程序在退出之前执行任何必要的清理操作。实际上,有些程序根本不允许您使用中断来终止它们。3.12.3 后台运行和终止作业。让我们从一个简单的例子开始。命令 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。yes3.12.3 后台运行和终止作业。是一个看似无用的命令,它向标准输出发送无休止的
y
流。(这实际上很有用。如果您将3.12.3 后台运行和终止作业。的输出通过管道传输到另一个提出一系列是和否问题的命令,3.12.3 后台运行和终止作业。流将确认所有问题。) 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。 授予文件的权限还取决于文件所在目录的权限。例如,即使文件设置为试试看 试试看将继续无限期。您可以通过按中断键(通常是 Ctrl-C)来终止该进程。为了避免忍受烦人的
流,让我们重定向 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。的标准输出到3.12.3 后台运行和终止作业。/dev/null试试看。您可能还记得,
充当数据的“黑洞”。发送给它的任何数据都会消失。这是一种非常有效的方法,可以使原本冗长的程序安静下来。 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。啊,好多了。没有任何打印输出,但 shell 提示符没有返回。这是因为 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。仍在运行,并将那些愚蠢的
发送到&。同样,要终止作业,请按中断键。
假设您希望[1] 164
命令继续运行,但希望返回 shell 提示符以便您可以处理其他事情。您可以将 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。放入后台,使其在后台运行,而无需交互。
将进程放入后台的一种方法是在命令末尾附加一个“[1]
& 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。”字符。 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。正如您所看到的,shell 提示符已返回。但是,这个“1rw-164[1]
”是什么?并且 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。命令真的在运行吗?3.12.3 后台运行和终止作业。/dev/null试试看要检查此进程的状态,请使用内部 shell 命令jobs.
果然,它就在那里。您也可以使用 命令(如上所示)来检查作业的状态。
要终止作业,请使用kill命令。此命令接受作业号或进程 ID 号作为参数。这是作业号 1,因此使用命令
会杀死该作业。当使用作业号标识作业时,您必须在数字前加上百分号 (``%'') 字符。
既然您已经杀死了该作业,请使用jobs再次检查它
作业实际上已经死了,如果您再次使用jobs命令,则不应打印任何内容。
您也可以使用进程 ID (PID) 号杀死作业,该号码在您启动作业时与作业 ID 一起显示。在我们的示例中,进程 ID 是 164,因此命令是
图 3.1: 典型的(简略的)Linux 目录树。
当通过进程 ID 引用作业时,您不需要使用 ``%''。
还有另一种将作业放入后台的方法。您可以正常启动作业(在前台),停止作业,然后在后台重启它。
首先,像之前一样在前台启动 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。进程
再次,因为 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。在前台运行,您不应该获得 shell 提示符。
现在,与其使用 Ctrl-C 中断作业,不如挂起作业。挂起作业不会杀死它:它只是暂时停止作业,直到您重启它。为此,请按挂起键,通常是 Ctrl-Z。
当作业被挂起时,它只是没有运行。该作业不使用 CPU 时间。但是,您可以重启作业,这将导致作业再次运行,就像什么都没发生过一样。它将从中断的地方继续运行。
要在前台重启作业,请使用fg命令(代表 ``foreground'',即“前台”)。
shell 再次显示命令名称,以便您知道刚刚将哪个作业放入前台。再次使用 Ctrl-Z 停止作业。这次,使用bg命令将作业放入后台。这将导致命令像您上次在上一节中那样使用 ``&'' 启动命令一样运行。
您又获得了提示符。Jobs应该报告 作业也可以被挂起。挂起的作业是暂时停止的作业。挂起作业后,您可以告诉作业根据需要在前台或后台继续运行。恢复挂起的作业不会以任何方式更改作业的状态——作业会从它停止的地方继续运行。确实正在运行,您可以使用kill像之前一样杀死该作业。
您如何再次停止作业?使用 Ctrl-Z 将不起作用,因为作业在后台运行。答案是使用fg将作业放入前台,然后停止它。事实证明,您可以在停止的作业或后台作业上使用fg。
后台作业和停止的作业之间存在很大差异。停止的作业不运行——它不使用任何 CPU 时间,也不做任何工作(作业仍然占用系统内存,尽管它可能已被交换到磁盘)。后台作业正在运行并使用内存,并在您进行其他工作时完成某些任务。
但是,后台作业可能会尝试在您的终端上显示文本,如果您尝试进行其他操作,这可能会很烦人。例如,如果您使用命令
而不将 stdout 重定向到试试看,则会有一连串的3.12.3 后台运行和终止作业。's 显示在您的屏幕上,您无法中断它。(您不能使用 Ctrl-C 中断后台作业。)为了停止无休止的3.12.3 后台运行和终止作业。's,请使用fg命令将作业带到前台,然后使用 Ctrl-C 杀死它。
另一个注意事项。fg。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用bg命令通常会影响上次停止的作业(当您使用+命令时,作业号旁边会显示一个 ``jobs'')。如果您一次运行多个作业,则可以通过将作业 ID 作为参数提供给fg或bg来将作业放入前台或后台,例如
(将作业号 2 放入前台),或
(将作业号 3 放入后台)。您不能将进程 ID 号与fg或bg.
一起使用。此外,仅使用作业号,如
图 3.1: 典型的(简略的)Linux 目录树。
请记住,作业控制是 shell 的一项功能。fg, bg。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用jobs命令是 shell 内部的。如果由于某种原因您使用的 shell 不支持作业控制,请不要期望这些命令可用。
此外,在第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用/home/larry之间,作业控制的某些方面有所不同。实际上,某些 shell 根本不提供作业控制——但是,大多数可用于 Linux 的 shell 都提供作业控制。
文本编辑器是一种用于编辑由文本组成的文件的程序:例如信件、C 程序或系统配置文件。虽然 Linux 上有许多此类编辑器可用,但您保证在任何 UNIX 或 Linux 系统上都能找到的唯一编辑器是vi——“可视化编辑器”。vi不是最容易使用的编辑器,也不是非常不言自明的。但是,由于vi在 UNIX/Linux 世界中如此常见,有时又是必需的,因此值得在此处讨论。
您对编辑器的选择主要是个人品味和风格的问题。许多用户更喜欢华丽、不言自明且功能强大的emacs——一个功能比 UNIX 世界中任何其他单个程序都多的编辑器。例如,Emacs 有其自己内置的 LISP 编程语言方言,并且有许多扩展程序(其中之一是类似 Eliza 的人工智能程序)。但是,由于 Emacs 及其支持文件相对较大,因此可能未安装在某些系统上。vi另一方面,vi体积小巧且功能强大,但使用起来更困难。但是,一旦您了解了
,实际上就非常容易了。vi本节介绍vi的入门知识——我们不会讨论它的所有功能,只讨论您入门所需了解的功能。如果您有兴趣了解有关此编辑器功能的更多信息,可以参考
”开头,如上面的vi3.13.1 概念。
在任何时候,您都处于三种操作模式之一。vi这些模式称为命令模式、插入模式和末行模式。对文件 当您启动
时,您处于命令模式。此模式允许您使用命令来编辑文件或更改为其他模式。例如,在命令模式下键入 ``vi'' 会删除光标下方的字符。箭头键可在您正在编辑的文件中移动光标。通常,命令模式下使用的命令长度为一到两个字符。 您实际上是在插入模式下插入或编辑文本。使用时,您可能会将大部分时间花费在此模式下。您可以通过从命令模式中使用诸如 ``
ivi''(代表“插入”)之类的命令来启动插入模式。在插入模式下,您可以将文本插入到文档中的当前光标位置。要结束插入模式并返回到命令模式,请按 Esc。: 末行模式是一种特殊模式,用于向提供某些扩展命令。在键入这些命令时,它们会显示在屏幕的最后一行(因此得名)。例如,当您在命令模式下键入 ``'' 时,您会跳转到末行模式,并且可以使用诸如 ``viwq''(写入文件并退出),或 ``viq!vi''(退出
长度超过一个字符的命令。在末行模式下,您输入单行命令并按 Enter 键执行它。vi3.13.2 启动
理解这些概念的最佳方法是启动vi。这并没有告诉我们太多——这些是目录还是文件?我们可以使用
并编辑文件。下面的示例“屏幕”仅显示几行文本,就好像屏幕只有六行高而不是二十四行高一样。
的语法为vi其中 filename 是要编辑的文件名。
通过键入来启动以编辑文件
test~。您应该看到类似以下内容:
'' 字符列指示您位于文件末尾。 代表光标。 vi3.13.3 插入文本。
程序现在处于命令模式。按 i 将编辑器置于插入模式,然后开始键入,从而将文本插入到文件中。
键入任意多行(每行后按 Enter 键)。您可以使用退格键更正错误。
要结束插入模式并返回命令模式,请按 Esc。vi在命令模式下,您可以使用箭头键在文件中移动。(如果您只有一行文本,尝试使用向上或向下箭头键可能会导致
向您发出哔哔声。) 您实际上是在插入模式下插入或编辑文本。使用除了命令之外,还有几种插入文本的方法。a
命令在当前光标位置之后开始插入文本,而不是在当前光标位置。例如,使用左箭头键将光标移动到单词“good”和“men”之间。按 a 启动插入模式,键入 ``wo
'',然后按 Esc 返回命令模式。要在下一行开始插入文本,请使用o
3.13.4 删除文本。对文件 在命令模式下,
命令删除光标下的字符。如果您按 x 键五次,您将得到
现在按 a 并插入一些文本,然后按 esc您可以使用命令dd您可以使用命令(即,连续按两次 d)删除整行。如果光标位于第二行,并且您键入
,您将看到要删除光标所在的单词,请使用dw要删除光标所在的单词,请使用.
3.13.5 更改文本。 您可以使用R
命令替换文本部分。将光标放在“party”中的第一个字母上,按 R,然后键入单词“hungry”。 您可以使用使用 您实际上是在插入模式下插入或编辑文本。使用。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用命令之外,还有几种插入文本的方法。编辑文本类似于 您可以使用命令,但
”目录开始,也称为“根目录”。在”)表示授予文件所有者覆盖而不是插入文本。”)表示授予文件所有者显示文件命令替换光标下的单个字符。例如,将光标移动到单词“Now”的开头,然后按(即,连续按两次 d)删除整行。如果光标位于第二行,并且您键入
3.13.6 移动光标的命令。 您已经知道如何使用箭头键在文档中移动。此外,您可以使用, h, j 文件通过其文件名来标识。例如,包含您的历史论文的文件可能会以文件名kl
”目录开始,也称为“根目录”。在r命令分别向左、向下、向上和向右移动光标。当(由于某种原因)您的箭头键无法正常工作时,这会派上用场。命令将光标移动到下一个单词的开头;b
”目录开始,也称为“根目录”。在0命令将其移动到上一个单词的开头。$命令(即零键)将光标移动到当前行的开头,而
命令将其移动到行尾。
编辑大型文件时,您需要一次向前或向后移动一个屏幕。按 Ctrl-F 将光标向前移动一个屏幕,而 Ctrl-B 将其向后移动一个屏幕。要将光标移动到文件末尾,请按G。您也可以移动到任意行;例如,键入命令10G会将光标移动到文件中的第 10 行。要移动到文件开头,请使用.
1G您可以将移动命令与其他命令(例如用于删除文本的命令)结合使用。例如,d$命令删除从光标到行尾的所有内容;dG
3.13.7 保存文件和退出vi 要退出而不对文件进行更改,请使用命令:q!:。当您按 ``
'' 时,光标会移动到屏幕的最后一行,您将处于末行模式。''(写入文件并退出在末行模式下,可以使用某些扩展命令。其中之一是vi,它退出而不保存。命令:wqvi保存文件然后退出。命令ZZ:(从命令模式,没有 ``而不保存。命令'')等同于
。如果自上次保存以来文件未更改,则它仅退出,并保留上次更改的修改时间。请记住,您必须在末行模式下输入的命令后按 Enter 键。要在不退出 vi 的情况下保存文件,请使用.
3.13.8 编辑另一个文件。 要编辑另一个文件,请使用:e来启动命令。例如,要停止编辑”,参数是“并编辑文件
,请使用命令 要编辑另一个文件,请使用如果您使用
而不先保存文件,您将收到错误消息vi这意味着在您保存第一个文件之前,要在不退出 vi 的情况下保存文件,请使用不想编辑另一个文件。此时,您可以使用 要编辑另一个文件,请使用保存原始文件,然后使用
将进程放入后台的一种方法是在命令末尾附加一个“!,或者您可以使用命令vi``
您是认真的——编辑新文件而不保存对第一个文件的更改。3.13.9 包含其他文件。 如果您使用
:r命令,则可以将另一个文件的内容包含在当前文件中。例如,命令会将文件
的内容插入到光标位置的文本中。vienglish-lit3.13.10 运行 shell 命令。 您也可以在3.13.9 包含其他文件。:r!
中运行 shell 命令。
命令的工作方式类似于vi,但它不是读取文件,而是将给定命令的输出插入到当前光标位置的缓冲区中。例如,如果您使用命令vi您最终会得到
您也可以“跳出”MAKE,换句话说,从
vi中运行命令,并在完成后返回到编辑器。例如,如果您使用命令命令将被执行,结果将显示在屏幕上,但不会插入到您正在编辑的文件中。如果您使用命令会启动一个 shell 实例,让您在执行其他命令时暂时“暂停” vi。只需注销 shell(使用vi.
vi3.13.11 获取vi. vi帮助。没有提供太多交互式帮助(大多数 Linux 程序都没有),但您始终可以阅读的手册页。vi是vi编辑器的可视化前端;它处理没有提供太多交互式帮助(大多数 Linux 程序都没有),但您始终可以阅读中的许多末行模式命令。因此,除了阅读
3.14 自定义您的环境。
lp book
打印emacs或vi与其键入所有这些命令,不如将它们分组到一个 shell 脚本中。用于运行所有这些命令的 shell 脚本可能如下所示
Shell 脚本只是纯文本文件;您可以使用诸如之类的编辑器创建它们,该编辑器从第 页开始描述。让我们看一下这个 shell 脚本。第一行 ``ls -F#!/bin/shls -F'' 将文件标识为 shell 脚本,并告知 shell 如何执行该脚本。它指示 shell 将脚本传递给ls -F以供执行,其中第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。是 shell 程序本身。为什么这很重要?在大多数 Linux 系统上,ls -F是 Bourne 类型 shell,例如/home/larry。通过强制 shell 脚本使用
运行,您可以确保脚本将在 Bourne 语法 shell(而不是 C shell)下运行。即使您使用#(或其他 C shell)作为您的登录 shell,这也将使您的脚本使用 Bourne 语法运行。
'' 开头,并持续到行尾。注释被 shell 忽略——它们通常用于向程序员标识 shell 脚本,并使脚本更易于理解。脚本的其余行只是命令,就像您直接在 shell 提示符下键入它们一样。实际上,shell 读取脚本的每一行,并运行该行,就好像您在 shell 提示符下键入它一样。 权限对于 shell 脚本很重要。如果您创建了一个 shell 脚本,请确保您对该脚本具有执行权限才能运行它。当您创建文本文件时,默认权限通常不包括执行权限,您必须显式设置它们。有关详细信息,请参见第 页上有关文件权限的讨论。简而言之,如果此脚本保存在名为
makebook脚本的其余行只是命令,就像您直接在 shell 提示符下键入它们一样。实际上,shell 读取脚本的每一行,并运行该行,就好像您在 shell 提示符下键入它一样。.
的文件中,则可以使用命令
为 shell 脚本
来运行脚本中的所有命令。
/home/larry3.14.2 Shell 变量和环境。第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。 shell 允许您定义变量,就像大多数编程语言一样。变量只是给定名称的一段数据。/home/larry以及其他 C 类型 shell,使用与此处描述的不同的机制来设置变量。此讨论假设使用像
这样的 Bourne shell。有关详细信息,请参见=手册页。$当您为变量赋值(使用 ``
'' 运算符)时,您可以通过在变量名称前加上 ``”,参数是“'' 来访问该变量,如下所示。变量被赋予值$hello there
。然后,您可以通过以 ``
'' 字符为前缀的变量名来引用此值。例如,命令产生与相同的结果。
这些变量是 shell 内部的,这意味着只有 shell 可以访问它们。这在 shell 脚本中可能很有用;例如,如果您需要跟踪文件名,则可以将其存储在变量中,如上所述。使用set命令显示所有已定义的 shell 变量的列表。
但是,shell 允许您将变量导出到环境。环境是您可以执行的所有命令都可以访问的变量集。一旦您在 shell 内部定义了一个变量,导出它也会使该变量成为环境的一部分。使用第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用/home/larry命令/home/larryexport命令将变量导出到环境。 再次,这里我们区分/home/larry,另一种语法用于设置环境变量(使用
setenv
命令)。有关更多信息,请参见手册页。 环境对于 UNIX 系统非常重要。它使您可以通过仅设置命令知道的变量来配置某些命令。ls /etc这是一个简单的示例。环境变量手册页。PAGER/由
命令使用,它指定用于一次一屏显示手册页的命令。如果您将手册页。设置为命令的名称,则它将使用该命令来显示手册页,而不是Mail/ papers/ letters/(默认值)。ls /etc将
设置为 ``手册页。''. 这会导致
的输出一次性显示在屏幕上,而不会在页面之间暂停。现在,将导出到环境。
尝试命令手册页。设置为命令的名称,则它将使用该命令来显示手册页,而不是/man ls/。手册页应该快速闪过您的屏幕,而不会为您暂停。
现在,如果我们设置set'', 则手册页。命令用于显示手册页。
请注意,在我们更改
的值后,我们不必使用ls /etc命令。我们只需要导出一次变量;此后对其进行的任何更改都将自动传播到环境。手册页。通常需要引用字符串,以防止 shell 将各种字符视为特殊字符。例如,您需要引用字符串以防止 shell 解释诸如 ``*''、``?'' 或空格之类的字符的特殊含义。还有许多其他字符可能需要受到保护以免被解释。SSC 的 Bourne Shell Tutorial 中详细解释和描述了引用。
特定命令的手册页会告诉您该命令是否使用任何环境变量。例如,手册页解释说用于指定寻呼机命令。
某些命令共享环境变量。例如,许多命令使用EDITOR环境变量来指定在需要编辑器时要使用的默认编辑器。
环境还用于跟踪有关您的登录会话的重要信息。一个示例是HOME环境变量,其中包含您的主目录的名称。
另一个有趣的环境变量是#PS1
”目录开始,也称为“根目录”。在第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。,它定义了主 shell 提示符。例如,
手册页描述了用于设置提示符的语法。~karl/lettersPATH~karl/letters环境变量。~karl/letters 当您使用中还有另一个目录,名为命令时,shell 如何找到要将提示符设置回默认值(其中包含当前工作目录,后跟 ``可执行文件本身?实际上,
在大多数系统上都位于要将提示符设置回默认值(其中包含当前工作目录,后跟 ``中。shell 使用环境变量
来查找您键入的命令的可执行文件。:例如,您的~karl/letters变量可能设置为这是 shell 要搜索的目录列表,每个目录用 ``'' 分隔。当您使用命令时,shell 首先查找/bin/ls
,然后查找要将提示符设置回默认值(其中包含当前工作目录,后跟 ``/usr/bin/ls
,依此类推。要将提示符设置回默认值(其中包含当前工作目录,后跟 ``请注意,”,参数是“。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用”和“与查找常规文件无关。例如,如果您使用命令要将提示符设置回默认值(其中包含当前工作目录,后跟 ``shell 不使用此命令的名称是“来查找文件
——这些文件名被认为是完整的。shell 仅使用来显示, 中还有另一个目录,名为来查找可执行文件。这节省了您的时间,并且意味着您不必记住所有命令可执行文件都存储在哪里。在许多系统上,可执行文件分散在许多地方,例如或/usr/local/bin要将提示符设置回默认值(其中包含当前工作目录,后跟 ``。与其给出命令的完整路径名(例如
/usr/bin/cp要将提示符设置回默认值(其中包含当前工作目录,后跟 ``),不如将.设置为您希望 shell 自动搜索的目录列表。请注意,包含 ``要将提示符设置回默认值(其中包含当前工作目录,后跟 ``'', 这是当前工作目录。这使您可以创建 shell 脚本或程序,并从当前目录将其作为命令运行,而无需直接指定它(如
中,则 shell 将不会搜索它以查找要运行的命令;这也包括当前目录。3.14.3 Shell 初始化脚本。 除了您创建的 shell 脚本之外,shell 本身还使用许多脚本用于特定目的。其中最重要的是初始化脚本,它们是 shell 在您登录时执行的脚本。
初始化脚本本身只是 shell 脚本。但是,它们通过在您登录时自动执行命令来初始化您的环境。如果您总是使用第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。。这三个文件中的每一个都包含 Larry 的三个正在进行的项目的信息。要引用/home/larrymaillogin命令在登录时检查邮件,则将该命令放在初始化脚本中,以便它自动执行。vi 和login都区分登录 shell 和 shell 的其他调用。
shell 是您登录时调用的 shell。通常,它是您唯一会使用的 shell。但是,如果您从另一个程序(如第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。)“跳出” shell,则会启动 shell 的另一个实例,这不是您的shell。此外,每当您运行 shell 脚本时,您都会自动启动 shell 的另一个实例来执行该脚本。 第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。使用的初始化文件是login/etc/profile(由系统管理员设置,并在时由所有login 第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。会话),以及$HOME/.bashrc(由所有非login实例执行第
页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。)。如果.bash_profile不存在,.profile则会改用它。
/home/larry使用以下初始化脚本/etc/csh.login(由所有/home/larry使用的初始化文件是login/etc/profile$HOME/.tcshrc(在登录时以及所有新的/home/larry),以及$HOME/.login(在login时执行,在.tcshrc)。如果.tcshrc不存在,.cshrc则会改用它。
一本完整的 Shell 编程指南将超出本书的范围。请参阅手册页以了解更多关于第 页上的图表显示了一个示例目录树,它应该让您了解系统上的目录树是如何组织的。或/home/larry以了解更多关于自定义 Linux 环境的信息。
本章应该为您提供足够的关于 Linux 基本使用的信息。手册页是学习 Linux 不可或缺的工具。它们起初可能看起来令人困惑,但是如果您深入挖掘,就会发现其中蕴含着丰富的信息。
我们还建议您阅读一本通用的 Linux 参考书。Linux 具有比第一眼看上去更多的功能。不幸的是,其中许多功能超出了本书的范围。其他推荐的 Linux 书籍列在附录 A 中。