使用 Shell

目录

18.1. Bash shell 入门
18.2. 用户和访问权限
18.3. 重要的 Linux 命令
18.4. vi 编辑器

摘要

引导 Linux 系统时,您通常会被定向到一个图形用户界面,此界面将引导您完成登录过程以及与系统的后续交互操作。 图形用户界面已变得越来越重要且易于使用,但这并不是与系统通信的唯一方式。 您也可以使用面向文本的通信方式,如通常称为 shell 的命令行解释器,在 shell 中可以输入命令。 Linux 提供通过图形用户界面启动 shell 窗口的选项,因此您可以方便地使用两种方式。

在管理中,基于文本的应用程序对于通过慢速网络链接控制计算机或在您希望作为 root 在命令行上执行任务时非常重要。 对于 Linux“菜鸟”,在 shell 中输入命令可能不太习惯,但不久后您就会意识到 shell 不仅仅是为管理员而准备的 - 其实,shell 通常是执行日常任务的最快捷、最方便的方式。

UNIX 或 Linux 有多个 shell。 SUSEŽ Linux Enterprise 中的默认 shell 是 Bash (GNU Bourne-Again Shell)。

本章介绍使用 shell 时必须了解的一些基础知识。 包含以下主题:如何输入命令、Linux 的目录结构、如何使用文件和目录以及如何使用一些基本功能、Linux 的用户和权限概念、重要 shell 命令的概要以及 vi 编辑器(Unix 和 Linux 系统中始终可用的默认编辑器)的简短描述。

Bash shell 入门

在 Linux 中,您可以使用与图形用户界面并行的命令行并在两者之间轻松切换。要通过 KDE 中的图形用户界面启动终端窗口,请单击面板中的 Konsole 图标。 在 GNOME 中,单击面板中的 GNOME 终端图标。

此时出现 Konsole 或 GNOME 终端窗口,窗口的第一行显示类似于图 18.1 “Bash 终端窗口示例”所示的提示符。此提示符通常显示您的登录名(在本例中为 tux)、计算机的主机名(此处为 knox)以及当前路径(本例中您的用户主目录,用波浪符 ~ 表示)。 当您登录到远程计算机时,您始终可以通过此信息了解到您当前在哪个系统上工作。 当光标移到该提示后面时,您可以直接向所在计算机系统发送命令。

图 18.1. Bash 终端窗口示例

Bash 终端窗口示例

输入命令

一条命令包含若干元素。 第一个元素总是真正的命令,随后是参数或选项。 通过使用 <—DelSpace,您可以输入和编辑命令。 您还可以添加选项或更正输入错误。 按 Enter 时命令将被执行。

[Important]没有消息就是好消息

该 shell 很简洁:与某些图形用户界面不同,它在执行命令后通常不提供确认消息。 只有在出现问题或错误的情况下才会显示消息。

使用命令来删除对象时也要牢记这点。 输入 rm 之类的命令删除文件之前,您应了解是否确实要删除此对象:它会被无可挽回地删除,而不会询问您。

使用不带选项的命令

用一个简单的例子看看命令的结构:ls 命令, 用于列出目录内容。此命令可带选项也可不带选项。 只输入 ls 命令将显示当前目录的内容:

图 18.2. ls 命令

ls 命令

与其他操作系统不同,Linux 中的文件可带有 .txt 等文件扩展名,但扩展名不是必需的。 这会造成难以区分 ls 输出中的文件和文件夹。 默认设置下的颜色可给您提示:目录通常以蓝色显示,文件以黑色显示。

使用带选项的命令

要获得有关目录内容的更多细节,最好使用带选项字符串的 ls 命令。选项可修改命令的工作方式,使您能够使用命令来执行特定任务。 选项以连字符为前缀,通过空格与命令分隔。 命令 ls -l 将显示同一目录中内容的详细信息(长列表格式):

图 18.3. ls -l 命令

ls -l 命令

每个对象名称的左侧都会显示几列有关此对象的信息。 最重要的原则如下:第一列显示对象的文件类型(在本例中,d 为目录,- 为普通文件)。 接下来的 9 列显示对象的用户权限。 第 11 和 12 列显示文件拥有者和组的名称(本例中为 tuxusers)。 有关用户权限和 Linux 的用户概念的详细信息,请参见第 18.2 节 “用户和访问权限”。 下一列显示文件大小,单位为字节。 然后显示上次更改的日期和时间。 最后一列显示对象名称。

如果您想要了解更多信息,您可以组合 ls 命令的两个选项并输入 ls -la。 shell 此时还会显示目录中的隐藏文件,通过在前面加一个圆点来表示(例如 .hiddenfile)。

获得帮助

任何用户都没有必要记忆所有命令的所有选项。 如果您记住了命令名称但对选项不太确定,您可以先输入命令,紧接着输入一个空格和 --help。 许多命令都有这个 --help 选项。 输入 ls --help 可以显示 ls 命令的所有选项。

Linux 目录结构

shell 不提供与文件管理器中的树视图类似的目录和文件图形化概览,因此有关 Linux 系统中的默认目录结构的基础知识非常有用。 您可以将目录视为储存文件、程序和子目录的电子文件夹。 层次中的顶级目录是根目录,用 / 表示。 从此目录可以访问其他所有目录。

图 18.4 显示了 linux 中的标准目录树,其中的用户主目录包含示例用户 yxzlinuxtux/home 目录包含用于储存个人用户私人文件的目录。

[Note]网络环境中的用户主目录

如果您在网络环境中工作,您的用户主目录可能不是 /home。 可将它映射到文件系统中的任何目录。

以下列表简要说明了 Linux 中的标准目录。

图 18.4. 标准目录树节选

标准目录树节选

表 18.1. 标准目录树概述

/

根目录,目录树的起点

/home

用户的个人目录

/dev

代表硬件组件的设备文件

/etc

重要的系统配置文件

/etc/init.d

引导脚本

/bin/sbin

引导过程中早期所需的程序(/bin)和管理员的程序(/sbin

/usr/usr/local

所有应用程序和本地的、与发布版无关的扩展(/usr/local

/usr/bin/usr/sbin

通常可访问的程序(/usr/bin)和供系统管理员访问的程序(/usr/sbin

/usr/share/doc

各种文档文件

/tmp/var/tmp

临时文件(不要在此目录中保存文件,除非您不需要这些文件)

/opt

选件,大型装载程序包(如 KDE、GNOME 和 Netscape)

/proc

处理文件系统

/sys

system 文件系统,在其中收集内核的所有设备信息

/var/log

系统日志文件


使用目录和文件

要寻址某一特定文件或目录,您必须指定通向该目录或文件的路径。 指定路径的方法有两种:

  • 从根目录到相应文件的完整(绝对)路径

  • 从当前目录开始的路径(相对路径)

绝对路径始终以斜线开头。 相对路径的开头没有斜线。

[Note]Linux 区分大小写

Linux 在文件系统中区分大小写。 例如,Linux 区别对待输入的 test.txtTest.txt。 输入文件名或路径时请牢记这点。

要更改目录,请使用 cd 命令。

  • 要切换到用户主目录,请输入 cd

  • 用一个圆点 (.) ) 表示当前目录。这主要对其他命令(cpmv 和 …)有用。

  • 树的上一级用两个点 (..) ) 来表示。例如,要切换到当前目录的父目录,请输入 cd ..

文件寻址示例

第 18.1.3 节 “使用目录和文件”中的 cd 命令使用相对路径。 您也可以使用绝对路径。 例如,假设您要将文件从用户主目录复制到 /tmp 的一个子目录:

  1. 首先,通过用户主目录在 /tmp 中创建一个子目录:

    1. 如果当前目录不是用户主目录,请输入 cd ~ 切换到用户主目录。 无论在文件系统中的何处,您都可以输入 cd ~ 进入用户主目录。

    2. 在用户主目录中输入 mkdir /tmp/testmkdir 代表 “make directory”,即创建目录。 此命令会在 /tmp 目录下创建一个名为 test 的新目录。 此时,使用绝对路径来创建目录。

    3. 此时要检查目录中的变化,请输入 ls -l /tmp。 新目录 test 应显示在 /tmp 目录的内容列表。

  2. 接下来,在用户主目录中创建一个新文件并将使用相对路径它复制到 /tmp/test 目录。

    1. 输入 touch myfile.txt。 带有 myfile.txt 选项的 touch 命令会在当前目录下创建一个新的空文件,名为 myfile.txt

    2. 输入 ls -l 进行检查。 内容的列表中应出现新文件。

    3. 输入 cp myfile.txt ../tmp/test。 这会将 myfile.txt 复制到 /tmp/test 目录,文件名不会改变。

    4. 输入 ls -l /tmp/test 进行检查。 文件 myfile.txt 应出现在 /tmp/test 的内容列表。

要列出其他用户主目录的内容,请输入 ls ~username。 在图 18.4 “标准目录树节选”的示例目录树中,其中一个样本用户是 tux。 这样,使用 ls ~tux 就会列出 tux 用户主目录的内容。

[Note]处理文件名或目录名中的空格

如果文件名包含空格,可在空格前面使用反斜杠 (\) 将空格转义或将文件名包含在单引号或双引号中。 否则 Bash 会将 My Documents 这样的文件名解释为两个文件或目录的名称。 单引号和双引号的区别在于双引号中可发生变量扩展。 而单引号确保 shell 按字面查看括起来的字符串。

shell 的实用功能

在 Bash 中输入命令可能包含大量键入操作。 以下介绍 Bash 的一些功能,这些功能可大大简化您的工作,省去大量按键操作。

历史记录和完成

默认情况下,Bash 会““记忆””您输入的命令。 此功能称为历史记录。 要重复以前输入过的命令,请按 键,直到所希望的命令在提示符处出现。 按 键以在先前输入命令列表中执行向前移动。 使用 Ctrl+R 可在历史记录中搜索。

在按 Enter 键执行命令之前,可编辑选定的命令,如更改文件名。 要编辑命令行,只需使用箭头键将光标移至所需位置并开始键入。

键入文件名或目录名的前几个字母后即补全完整的名称,这是 Bash 的另一个实用功能。 只需在键入前几个字母后按 →| 键即可实现此功能。 如果可唯一标识文件名或路径,则会立即补全并且光标移动到文件名的末端。 然后您可以输入命令的下一选项(如有必要)。 如果文件名或路径不能唯一确定(因为有多个文件名以这些字母开头),则只会将它们补全到之后会有多个选项的那一点。 此时再按一次 →| 键可获取选项列表。 然后您可以输入文件或路径的下一字母并按 →| 键再次尝试补全。 借助 →| 补全文件名和路径的同时,您可以检查您要输入的文件或路径是否确实存在(而且您可以保证拼写无误)。

通配符

shell 的便捷之处还体现在支持路径名扩展的通配符上。 通配符是可代表其他字符的字符。 Bash 提供三种不同的通配符:

?

完全匹配任一字符

*

匹配任意数目的字符

[set]

匹配在方括号中指定的字符组中的任一字符,这里用字符串 set 表示字符组。 作为 set 的一部分,还可以使用语法 [:class:] 指定字符类别,其中类别可以是 alnumalphaascii 等。

使用组开头的 ! 组开头的或 ^ ([!set]) 匹配 set 标识的字符之外的任一字符。

假设 test 目录包含文件 TestfileTestfile1Testfile2datafile

  • 命令 ls Testfile? 会列出文件 Testfile1Testfile2

  • 命令 ls Testfile? 会列出文件 Testfile1Testfile2

  • 使用 ls Test*,列表还会包含 Testfile

  • 命令 ls *fil* 用于显示所有示例文件。

  • 使用 set 通配符代表最后字符是数字的所有样本文件:ls Testfile[1-9] 或使用类:ls Testfile[[:digit:]]

四个通配符中匹配范围最广的是星号。 使用它可以将某个目录内的所有文件复制到另一个目录,或通过一个命令删除所有文件。 例如,使用命令 rm *fil* 可以删除当前目录中文件名包含字符串 fil 的所有文件。

使用 Less 和 More 查看文件

Linux 包含两个直接在 shell 中查看文本文件的小程序:lessmore。不必启动编辑器来阅读 Readme.txt 之类的文件,只需输入 less Readme.txt 即可在控制台窗口中显示其中的文本。 使用 Space 可以向下滚动一页。 使用 Page UpPage Down 可以在文本中前后移动。 要退出 less,请按 Q

除使用 less 之外,您还可以使用 more 这种较早的程序。 不过,该程序使用起来不太方便,因为它不允许向后滚动。

less 程序得名于 less is more(少即是多)原则,并且还可用来方便地查看命令输出。 要了解该程序的这种功能,请参见第 18.1.4.4 节 “重定向和管道”

重定向和管道

通常,shell 的标准输出界面是您的屏幕或控制台窗口,而标准输入设备是键盘。 但是,您可用通过 shell 的功能将输入或输出重定向到另一对象,如文件名或另一命令。 例如,借助 >< 符号,您可以将命令的输出转发到一个文件(输出重定向),或者将某文件用作命令的输入(输入重定向)。 举例来说,若要将 ls 等命令的输出写入文件,请输入 ls -l > file.txt。 这会创建一个名为 file.txt 的文件,此文件包含 ls 命令所生成的当前目录的内容列表。 但是,如果已存在名为 file.txt 的文件,则此命令会覆盖现有文件。 要防止这种情况,请使用 >>。 输入 ls -l >> file.txt 只会将 ls 命令的输出追加到名为 file.txt 的现有文件。 如果不存在此文件,则会创建它。

有时将文件用作命令的输入也很实用。 例如,通过 tr 命令,您可以替换重定向自文件的字符,并将结果写入标准输出,即屏幕。 假设要将上例中 file.txt 的所有字符 t 替换为 x 并将结果输出到屏幕上。 输入 tr t x < file.txt 即可完成此操作。

标准错误输出和标准输出一样,都发送至控制台。 要将标准错误输出重定向到名为 errors 的文件,则需要在相应命令中追加 2> errors。 如果追加的是 >& alloutput,标准输出和标准错误都将保存到名为 alloutput 的文件中。

使用管线管道也是一种重定向,虽然管道的使用并不局限于文件。 通过管道 (|),您可以组合多个命令,将命令的输出用作下一命令的输入。 例如,要在 less 中查看内容或当前目录,请输入 ls | less。 这只是在 ls 命令正常输出过长时才有意义。 例如,当您使用 ls /dev 命令查看 dev 目录的内容时,您只能在窗口中看到一小部分。 而使用 ls /dev | less 命令则能够查看整个列表。

存档和数据压缩

您已经创建了一些文件和目录,现在该考虑一下存档和数据压缩的问题了。 假定您想将整个 test 目录打包在一个文件中,以便备份到 USB 储存条或通过电子邮件发送。 要执行该操作,请使用命令 tar(代表 tape archiver,即磁带存档程序)。 使用 tar --help 可查看 tar 命令的所有选项。 下面对最重要的一些选项进行了说明:

-c

(代表 create)创建新档案。

-t

(代表 table)显示档案中的内容。

-x

(代表 extract)对档案解包。

-v

(代表 verbose)创建档案时在屏幕上显示所有文件。

-f

(代表 file)为档案文件选择一个文件名。 创建档案时,此选项总应放在最后。

要将 test 目录下的所有文件和子目录打包到名为 testarchive.tar 的档案中,请指定以下操作:

  1. 打开 shell。

  2. 使用 cd 来转到 test 目录所在的用户主目录。

  3. 输入 tar -cvf testarchive.tar test-c 选项会创建存档文件,使其成为 -f 所指示的文件。 -v 选项会按照这些文件的处理顺序列出文件。

  4. 可使用 tar -tf testarchive.tar 查看档案文件的内容。

test 目录及其所有文件和目录都在您的硬盘上保持不变。 要对档案解包,请输入 tar -xvf testarchive.tar,但目前不要尝试。

对文件压缩,典型的选择是 gzip ,为了得到更好的压缩率,也可选择 bzip2 只需输入 gzip testarchive.tar(或 bzip2 testarchive.tar,但本例中使用的是 gzip)。通过 ls,您可以看到文件 testarchive.tar 已不复存在,取而代之的是文件 testarchive.tar.gz。 这个文件要小得多,因此也更适于通过电子邮件传送或储存到 USB 储存条上。

现在,将该文件解包到先前创建的 test2 目录中。 这需要输入 cp testarchive.tar.gz test2 将文件复制到该目录中。 使用 cd test2 转至该目录。 扩展名为 .tar.gz 的压缩档案可用 gunzip 命令解压缩。 输入 gunzip testarchive.tar.gz 将生成文件 testarchive.tar,然后还需使用 tar -xvf testarchive.tar 命令抽取或执行 untar 操作。 您也可以用以下命令一次完成解压缩并抽取压缩存档:tar -xvf testarchive.tar.gz(不再需要添加 -z 选项)。 通过 ls,您会看到新建的 test 目录,其内容与用户主目录中的 test 目录的内容完全相同。

清理

经过上面的速成培训,您应该对 Linux shell 或命令行的基础知识有了一定的了解。 最后,您最好使用 rmrmdir 命令删除各种测试文件和文件夹,清理您的用户主目录。 在 第 18.3 节 “重要的 Linux 命令” 中,查找最重要命令的列表及其功能的简要描述。