目录
我认为学习计算机系统就像学习一门新的外语。虽然教程书籍和文档很有帮助,但你必须亲自实践。为了帮助你顺利入门,我将详细阐述几个基本要点。
Debian GNU/Linux 的强大设计源于 Unix 操作系统,即一个多用户、多任务操作系统。你必须学会利用这些特性以及 Unix 和 GNU/Linux 之间的相似之处的优势。
不要回避面向 Unix 的文本,也不要仅仅依赖 GNU/Linux 文本,因为这会让你失去很多有用的信息。
![]() |
注意 |
---|---|
如果你已经使用任何类 Unix 系统一段时间,并且使用命令行工具,你可能已经知道我在这里解释的所有内容。请将其用作现实检查和复习。 |
启动系统后,如果你没有安装X Window 系统以及诸如 gdm3
之类的显示管理器,你将看到基于字符的登录界面。假设你的主机名是 foo
,则登录提示符如下所示。
foo login:
如果你安装了 GUI 环境,例如 GNOME 或 KDE,那么你可以通过 Ctrl-Alt-F1 进入登录提示符,并且可以通过 Alt-F7 返回 GUI 环境(有关更多信息,请参见下面的第 1.1.6 节“虚拟控制台”)。
在登录提示符下,你键入你的用户名,例如 penguin
,然后按 Enter 键,然后键入你的密码并再次按 Enter 键。
![]() |
注意 |
---|---|
遵循 Unix 传统,Debian 系统的用户名和密码是区分大小写的。用户名通常仅从小写字母中选择。第一个用户帐户通常在安装期间创建。可以使用 root 用户通过 adduser(8) 创建其他用户帐户。 |
系统启动时会显示存储在“/etc/motd
”(每日消息)中的欢迎消息,并显示命令提示符。
Debian GNU/Linux lenny/sid foo tty1 foo login: penguin Password: Last login: Sun Apr 22 09:29:34 2007 on tty1 Linux snoopy 2.6.20-1-amd64 #1 SMP Sun Apr 15 20:25:49 UTC 2007 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. foo:~$
在此,可以通过编辑“/etc/motd.tail
”文件来自定义欢迎消息的主要部分。第一行是从系统信息中使用“uname -snrvm
”生成的。
现在你已进入 shell。shell 解释你的命令。
如果你通过在安装期间选择“桌面环境”任务来安装了X Window 系统以及诸如 GNOME 的 gdm3
之类的显示管理器,则在启动系统时会看到图形登录界面。你键入用户名和密码以登录到非特权用户帐户。使用 Tab 键在用户名和密码之间导航,或使用鼠标和主点击。
你可以通过启动 x-terminal-emulator
程序(例如 gnome-terminal(1)、rxvt(1) 或 xterm(1))在 X Window 下获得 shell 提示符。在 GNOME 桌面环境下,点击“应用程序”→“附件”→“终端”即可。
你还可以查看下面的第 1.1.6 节“虚拟控制台”。
在某些其他桌面系统(如 fluxbox
)下,可能没有明显的菜单启动点。如果发生这种情况,只需尝试(右键单击)屏幕中心,并希望弹出菜单。
root 账户也称为超级用户或特权用户。从这个帐户,你可以执行以下系统管理任务。
读取、写入和删除系统上的任何文件,无论其文件权限如何
设置系统上任何文件的文件所有权和权限
设置系统上任何非特权用户的密码
无需密码即可登录任何帐户
root 帐户的这种无限权力要求你在使用它时要谨慎和负责任。
![]() |
警告 |
---|---|
永远不要与他人分享 root 密码。 |
![]() |
注意 |
---|---|
文件的文件权限(包括硬件设备,如 CD-ROM 等,对于 Debian 系统而言,它们只是另一个文件)可能会使其无法被非 root 用户使用或访问。虽然使用 root 帐户是测试此类情况的快速方法,但其解决方案应通过正确设置文件权限和用户的组成员身份来完成(请参见第 1.2.3 节“文件系统权限”)。 |
以下是使用 root 密码获得 root shell 提示符的几种基本方法。
在基于字符的登录提示符下键入 root
。
在 GNOME 桌面环境下,点击“应用程序”→“附件”→“Root 终端”。
从任何用户 shell 提示符下键入“su -l
”。
这不会保留当前用户的环境。
从任何用户 shell 提示符下键入“su
”。
这将保留当前用户的部分环境。
当你的桌面菜单没有使用适当的权限自动启动 GUI 系统管理工具时,你可以从 X 终端模拟器的 root shell 提示符启动它们,例如 gnome-terminal(1)、rxvt(1) 或 xterm(1)。请参见第 1.1.4 节“root shell 提示符”和第 7.8.4 节“以 root 身份运行 X 客户端”。
![]() |
警告 |
---|---|
永远不要通过在诸如 gdm3(1) 之类的显示管理器的提示符中键入 |
![]() |
警告 |
---|---|
当显示关键信息时,永远不要在 X Window 下运行不受信任的远程 GUI 程序,因为它可能会窃听你的 X 屏幕。 |
在默认的 Debian 系统中,有六个可切换的 类似 VT100 的字符控制台可用于直接在 Linux 主机上启动命令 shell。除非你处于 GUI 环境中,否则你可以通过同时按下 左 Alt 键
和一个 F1
— F6
键在虚拟控制台之间切换。每个字符控制台都允许独立登录到帐户并提供多用户环境。这种多用户环境是一个很棒的 Unix 功能,并且非常令人上瘾。
如果你在 X Window 系统下,你可以通过按下 Ctrl-Alt-F1
键,即同时按下 左 Ctrl 键
、左 Alt 键
和 F1 键
来访问字符控制台 1。你可以通过按下 Alt-F7
返回到通常在虚拟控制台 7 上运行的 X Window 系统。
或者,你可以从命令行切换到另一个虚拟控制台,例如控制台 1。
# chvt 1
在命令提示符下键入 Ctrl-D
,即同时按下 左 Ctrl 键
和 d 键
,以关闭 shell 活动。如果你在字符控制台上,你将返回到登录提示符。即使这些控制字符被称为带有大写字母的“Control D”,你也不需要按 Shift 键。简写表达式 ^D
也用于 Ctrl-D
。或者,你可以键入“exit”。
如果你在 x-terminal-emulator(1) 中,你可以使用此方法关闭 x-terminal-emulator
窗口。
就像任何其他现代操作系统一样,文件操作涉及在内存中缓存数据以提高性能,Debian 系统在可以安全关闭电源之前需要正确的关机程序。这是为了通过强制将内存中的所有更改写入磁盘来维护文件的完整性。如果软件电源控制可用,则关机程序会自动关闭系统电源。(否则,你可能需要在关机程序后按住电源按钮几秒钟。)
你可以从命令行在正常的多用户模式下关闭系统。
# shutdown -h now
你可以从命令行在单用户模式下关闭系统。
# poweroff -i -f
或者,如果“/etc/inittab
”包含“ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
”,你可以键入 Ctrl-Alt-Delete
(同时按下 左 Ctrl 键
、左 Alt 键
和 Delete
键)来关机。有关详细信息,请参见 inittab(5)。
当屏幕在执行一些有趣的操作(例如“cat <some-binary-file>
”)后变得混乱时,请在命令提示符下键入“reset
”。你可能看不到你键入的命令回显。你也可以发出“clear
”来清理屏幕。
虽然即使是没有任何桌面环境任务的 Debian 系统的最小化安装也提供了基本的 Unix 功能,但最好安装一些额外的基于命令行和 curses 的字符终端软件包,例如 mc
和 vim
,新手可以使用 apt-get(8) 通过以下方式开始使用。
# apt-get update ... # apt-get install mc vim sudo ...
如果你已经安装了这些软件包,则不会安装新的软件包。
表 1.1. 有趣的文本模式程序软件包列表
软件包 | popcon | 大小 | 描述 |
---|---|---|---|
mc
|
http://qa.debian.org/popcon.php?package=mc | 1303 | 文本模式全屏文件管理器 |
sudo
|
http://qa.debian.org/popcon.php?package=sudo | 1397 | 允许用户拥有有限 root 权限的程序 |
vim
|
http://qa.debian.org/popcon.php?package=vim | 1873 | Unix 文本编辑器 Vi IMproved,程序员文本编辑器(标准版本) |
vim-tiny
|
http://qa.debian.org/popcon.php?package=vim-tiny | 830 | Unix 文本编辑器 Vi IMproved,程序员文本编辑器(紧凑版本) |
emacs23
|
http://qa.debian.org/popcon.php?package=emacs23 | 13038 | GNU 项目 Emacs,基于 Lisp 的可扩展文本编辑器(版本 23) |
w3m
|
http://qa.debian.org/popcon.php?package=w3m | 1825 | 文本模式 WWW 浏览器 |
gpm
|
http://qa.debian.org/popcon.php?package=gpm | 584 | 文本控制台上 Unix 风格的剪切和粘贴(守护进程) |
阅读一些信息丰富的文档可能是一个好主意。
表 1.2. 信息丰富的文档软件包列表
软件包 | popcon | 大小 | 描述 |
---|---|---|---|
doc-debian
|
http://qa.debian.org/popcon.php?package=doc-debian | 408 | Debian 项目文档,(Debian FAQ)和其他文档 |
debian-policy
|
http://qa.debian.org/popcon.php?package=debian-policy | 3381 | Debian 策略手册和相关文档 |
developers-reference
|
http://qa.debian.org/popcon.php?package=developers-reference | 1299 | Debian 开发者指南和信息 |
maint-guide
|
http://qa.debian.org/popcon.php?package=maint-guide | 693 | Debian 新维护者指南 |
debian-history
|
http://qa.debian.org/popcon.php?package=debian-history | 3571 | Debian 项目历史 |
debian-faq
|
http://qa.debian.org/popcon.php?package=debian-faq | 1212 | Debian FAQ |
doc-linux-text
|
http://qa.debian.org/popcon.php?package=doc-linux-text | 未找到 | Linux HOWTO 和 FAQ(文本) |
doc-linux-html
|
http://qa.debian.org/popcon.php?package=doc-linux-html | 未找到 | Linux HOWTO 和 FAQ(html) |
sysadmin-guide
|
http://qa.debian.org/popcon.php?package=sysadmin-guide | 964 | Linux 系统管理员指南 |
你可以通过以下方式安装其中一些软件包。
# apt-get install package_name
如果你不想将你的主用户帐户用于以下练习活动,你可以创建一个练习用户帐户,例如 fish
,方法如下。
# adduser fish
回答所有问题。
这将创建一个名为 fish
的新帐户。练习结束后,你可以通过以下方式删除此用户帐户及其主目录。
# deluser --remove-home fish
对于典型的单用户工作站,例如笔记本电脑 PC 上的桌面 Debian 系统,通常部署 sudo(8) 的简单配置,如下所示,以允许非特权用户(例如 penguin
)仅使用其用户密码而不是 root 密码来获得管理权限。
# echo "penguin ALL=(ALL) ALL" >> /etc/sudoers
或者,另一种常见的做法是允许非特权用户(例如 penguin
)无需任何密码即可获得管理权限,如下所示。
# echo "penguin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
此技巧仅应用于你管理且你是唯一用户的单用户工作站。
![]() |
警告 |
---|---|
不要像这样在多用户工作站上设置普通用户帐户,因为这对系统安全非常不利。 |
![]() |
注意 |
---|---|
以上示例中 |
![]() |
注意 |
---|---|
在这种情况下,管理员权限属于被授权在工作站上执行系统管理任务的人。除非公司的管理部门或你的老板获得授权且有能力,否则永远不要给他们这样的权限。 |
![]() |
注意 |
---|---|
为了向有限的设备和有限的文件提供访问权限,你应该考虑使用组来提供有限访问权限,而不是通过 sudo(8) 使用 |
![]() |
注意 |
---|---|
通过更周到和仔细的配置,sudo(8) 可以向共享系统上的其他用户授予有限的管理权限,而无需共享 root 密码。这可以帮助在具有多位管理员的主机上进行责任追究,以便你可以知道是谁做了什么。另一方面,你可能不希望其他人拥有此类权限。 |
现在你已准备好使用 Debian 系统进行练习,只要你使用非特权用户帐户,就不会有风险。
这是因为即使在默认安装之后,Debian 系统也配置了正确的文件权限,以防止非特权用户损坏系统。当然,可能仍然存在一些可以被利用的漏洞,但那些担心这些问题的人不应该阅读本节,而应该阅读Debian 安全手册。
我们将 Debian 系统作为类 Unix 系统学习,内容如下。
第 1.2 节“类 Unix 文件系统”(基本概念)
第 1.4 节“基本的类 Unix 工作环境”(基本方法)
第 1.5 节“简单的 shell 命令”(shell 机制)
第 1.6 节“类 Unix 文本处理”(文本处理方法)
在 GNU/Linux 和其他类 Unix 操作系统中,文件被组织成目录。所有文件和目录都排列在一个以“/
”为根的大树中。它被称为树,因为如果你绘制文件系统,它看起来像一棵树,但它是倒置的。
这些文件和目录可以分布在多个设备上。mount(8) 用于将某些设备上的文件系统附加到大的文件树上。相反,umount(8) 会再次分离它。在最近的 Linux 内核上,带有某些选项的 mount(8) 可以将文件树的一部分绑定到其他地方,或者可以将文件系统挂载为共享、私有、从属或不可绑定。每个文件系统支持的挂载选项在“/share/doc/linux-doc-2.6.*/Documentation/filesystems/
”中可用。
Unix 系统上的目录在某些其他系统上称为文件夹。另请注意,在任何 Unix 系统上都没有像“A:
”这样的驱动器概念。只有一个文件系统,并且包含所有内容。与 Windows 相比,这是一个巨大的优势。
以下是一些 Unix 文件基础知识。
文件名是区分大小写的。也就是说,“MYFILE
”和“MyFile
”是不同的文件。
根目录是指文件系统的根,简称为“/
”。不要将其与 root 用户的主目录混淆:“/root
”。
每个目录都有一个名称,该名称可以包含任何字母或符号,除了“/
”。根目录是一个例外;其名称为“/
”(发音为“slash”或“根目录”),并且无法重命名。
每个文件或目录都由完全限定文件名、绝对文件名或路径指定,给出到达该文件或目录必须经过的目录序列。这三个术语是同义的。
所有完全限定文件名都以“/
”目录开头,并且文件名中每个目录或文件之间都有一个“/
”。第一个“/
”是顶层目录,其他“/
”分隔连续的子目录,直到我们到达最后一个条目,即实际文件的名称。这里使用的词语可能会令人困惑。以以下完全限定文件名为例:“/usr/share/keytables/us.map.gz
”。但是,人们也将其基本名称“us.map.gz
”单独称为文件名。
根目录有许多分支,例如“/etc/
”和“/usr/
”。这些子目录又分支到更多的子目录中,例如“/etc/init.d/
”和“/usr/local/
”。集体查看的整个事物称为目录树。你可以将绝对文件名视为从树的底部(“/
”)到某个分支的末尾(文件)的路由。你还会听到人们谈论目录树,就好像它是一棵家谱树,包含称为根目录(“/
”)的单个人物的所有直接后代:因此,子目录具有父目录,并且路径显示文件的完整沿袭。还有从根目录以外的其他位置开始的相对路径。你应该记住,目录“../
”指的是父目录。此术语也适用于其他类似目录的结构,例如分层数据结构。
没有与物理设备(如硬盘)对应的特殊目录路径名组件。这与RT-11、CP/M、OpenVMS、MS-DOS、AmigaOS 和 Microsoft Windows 不同,在这些系统中,路径包含设备名称,例如“C:\
”。(但是,目录条目确实存在,它们引用物理设备作为正常文件系统的一部分。请参见第 1.2.2 节“文件系统内部结构”。)
![]() |
注意 |
---|---|
虽然你可以在文件名中使用几乎任何字母或符号,但在实践中这样做并不是一个好主意。最好避免在命令行中经常具有特殊含义的任何字符,包括空格、制表符、换行符和其他特殊字符: |
![]() |
注意 |
---|---|
单词“root”可以表示“root 用户”或“根目录”。其用法的上下文应使其明确。 |
![]() |
注意 |
---|---|
单词路径不仅用于上面的完全限定文件名,还用于命令搜索路径。预期含义通常从上下文中很清楚。 |
文件层次结构的详细最佳实践在文件系统层次结构标准(“/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz
”和 hier(7))中进行了描述。你应该记住以下事实作为入门。
遵循 Unix 传统,Debian GNU/Linux 系统提供了文件系统,硬盘和其他存储设备上的物理数据驻留在该文件系统下,并且与硬件设备(例如控制台屏幕和远程串行控制台)的交互以统一的方式在“/dev/
”下表示。
Debian GNU/Linux 系统上的每个文件、目录、命名管道(两个程序可以共享数据的一种方式)或物理设备都具有称为 inode 的数据结构,该结构描述了其关联的属性,例如拥有它的用户(所有者)、它所属的组、上次访问的时间等。如果你真的感兴趣,请参阅“/usr/include/linux/fs.h
”以获取 Debian GNU/Linux 系统中“struct inode
”的确切定义。在文件系统中表示几乎所有内容的想法是 Unix 的一项创新,现代 Linux 内核已经进一步发展了这个想法。现在,甚至可以在文件系统中找到有关计算机中运行的进程的信息。
这种物理实体和内部过程的抽象统一表示非常强大,因为它允许我们对许多完全不同的设备使用相同的命令进行相同类型的操作。甚至可以通过将数据写入链接到正在运行的进程的特殊文件来更改内核的工作方式。
![]() |
提示 |
---|---|
如果您需要确定文件树和物理实体之间的对应关系,请执行不带参数的 mount(8)。 |
文件系统权限 为受影响用户的三个类别定义了 类 Unix 系统。
拥有文件的用户 (u)
文件所属组中的其他用户 (g)
所有其他用户 (o),也称为 “world” 和 “everyone”
对于文件,每个对应的权限允许以下操作。
读取 (r) 权限允许所有者检查文件内容。
写入 (w) 权限允许所有者修改文件。
执行 (x) 权限允许所有者将文件作为命令运行。
对于目录,每个对应的权限允许以下操作。
读取 (r) 权限允许所有者列出目录内容。
写入 (w) 权限允许所有者在目录中添加或删除文件。
执行 (x) 权限允许所有者访问目录中的文件。
在此,目录的 执行 权限不仅意味着允许读取该目录中的文件,还允许查看其属性,例如大小和修改时间。
ls(1) 用于显示文件和目录的权限信息(以及更多信息)。当使用 “-l
” 选项调用时,它按给定的顺序显示以下信息。
文件类型(第一个字符)
文件的访问权限(九个字符,由用户、组和其他用户各三个字符组成,按此顺序排列)
文件的硬链接数
拥有文件的用户名
文件所属组的名称
文件大小(以字符(字节)为单位)
文件的日期和时间 (mtime)
文件的名称
s
# chown <newowner> foo # chgrp <newgroup> foo # chmod [ugoa][+-=][rwxXst][,...] foo
套接字
# cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX .
chown(1) 从 root 帐户用于更改文件的所有者。chgrp(1) 从文件所有者或 root 帐户用于更改文件的组。chmod(1) 从文件所有者或 root 帐户用于更改文件和目录访问权限。操作 foo
文件的基本语法如下。
例如,您可以使用以下命令使目录树归用户 foo
拥有并由组 bar
共享。
还有三个特殊的权限位。
设置用户 ID 位(s 或 S 代替用户的 x)
设置组 ID 位(s 或 S 代替组的 x)
粘滞 位(t 或 T 代替其他的 x)
这里,如果执行位被这些输出取消设置,则这些位的 “ls -l
” 输出为大写。
在可执行文件上设置设置用户 ID 允许用户以文件的所有者 ID (例如 root) 执行该可执行文件。 类似地,在可执行文件上设置 设置组 ID 允许用户以文件的组 ID (例如 root) 执行该可执行文件。 由于这些设置可能会导致安全风险,因此启用它们需要格外小心。
在目录上设置 设置组 ID 启用 类 BSD 文件创建方案,其中在该目录中创建的所有文件都属于该目录的 组。
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 crw------- 1 root root 108, 0 2007-04-29 07:00 /dev/ppp -rw-r--r-- 1 root root 1427 2007-04-16 00:19 /etc/passwd -rw-r----- 1 root shadow 943 2007-04-16 00:19 /etc/shadow -rwsr-xr-x 1 root root 700056 2007-04-22 05:29 /usr/sbin/exim4 $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 10 root root 4096 2007-04-29 07:59 /tmp drwxrwsr-x 10 root staff 4096 2007-03-24 18:48 /usr/local drwxrwsr-x 4 root src 4096 2007-04-27 00:31 /usr/src drwxrwsr-x 2 root mail 4096 2007-03-28 23:33 /var/mail drwxrwxrwt 2 root root 4096 2007-04-29 07:11 /var/tmp
在目录上设置 粘滞位 可防止目录中的文件被非文件所有者的用户删除。 为了保护全局可写目录(例如 “/tmp
”)或组可写目录中的文件内容,不仅必须重置文件的 写入 权限,还必须在目录上设置 粘滞位。 否则,任何具有目录写入权限的用户都可以删除该文件并创建一个同名的新文件。
以下是一些有趣的文件权限示例。
还有一种替代的数字模式,用于使用 chmod(1) 描述文件权限。 此数字模式使用 3 到 4 位宽的八进制(基数为 8)数字。 | 含义 |
---|---|
表 1.5. chmod(1) 命令中文件权限的数字模式 | 数字 |
第一个可选数字 | 设置用户 ID (=4)、设置组 ID (=2) 和 粘滞位 (=1) 的总和 |
第二个数字 | 读取 (=4)、写入 (=2) 和 执行 (=1) 权限的总和,针对用户 |
第三个数字 | 同上,针对组 |
第四个数字
同上,针对其他
$ touch foo bar $ chmod u=rw,go=r foo $ chmod 644 bar $ ls -l foo bar -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:22 bar -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:22 foo
![]() |
提示 |
---|---|
这听起来很复杂,但实际上很简单。 如果您查看 “ |
如果您需要在 shell 脚本中访问 “ls -l
” 显示的信息,则应使用相关命令,例如 test(1)、stat(1) 和 readlink(1)。 也可以使用 shell 内置命令,例如 “[
” 或 “test
”。
(file permissions) = (requested file permissions) & ~(umask value)
应用于新创建的文件或目录的权限受 umask shell 内置命令的限制。 请参阅 dash(1)、bash(1) 和 builtins(7)。 |
表 1.6. umask 值示例 | umask | 创建的文件权限 |
---|---|---|---|
0022
|
创建的目录权限
|
用法
|
002 |
0002
|
-rw-r--r--
|
-rwxr-xr-x
|
仅用户可写 |
0002
-rwxrwxr-x
![]() |
注意 |
---|---|
组可写 |
Debian 系统使用用户私有组 (UPG) 方案作为其默认设置。 每当向系统添加新用户时,都会创建一个 UPG。 UPG 的名称与为其创建的用户名称相同,并且该用户是 UPG 的唯一成员。 UPG 方案使其可以安全地将 umask 设置为 0002
,因为每个用户都有自己的私有组。 (在某些 Unix 变体中,将所有普通用户设置为属于单个 users
组是很常见的,并且在这种情况下,为了安全起见,最好将 umask 设置为 0022
。)
为了使组权限应用于特定用户,需要使用 “sudo vigr
” 将该用户设置为该组的成员。
或者,您可以通过将 “auth optional pam_group.so ” 行添加到 “/etc/pam.d/common-auth ” 并设置 “/etc/security/group.conf ” 来在身份验证过程中动态地将用户添加到组。 (请参阅 第 4 章,身份验证。) |
硬件设备只是 Debian 系统上的另一种文件。 如果您在从用户帐户访问 CD-ROM 和 USB 记忆棒等设备时遇到问题,则应使该用户成为相关组的成员。 |
---|---|
一些著名的系统提供的组允许其成员在没有
|
表 1.7. 用于文件访问的著名系统提供组列表 |
组
|
可访问文件和设备的描述 |
dialout
|
完全和直接访问串行端口 (“/dev/ttyS[0-3] ”) |
dip
|
有限访问串行端口,用于与受信任对等方的 拨号 IP 连接 |
cdrom
|
CD-ROM、DVD+/-RW 驱动器 |
audio
|
音频设备 |
video
|
视频设备 |
scanner
|
扫描仪 |
![]() |
提示 |
---|---|
adm |
系统监控日志
staff
或者,您可以通过将 “auth optional pam_group.so ” 行添加到 “/etc/pam.d/common-auth ” 并设置 “/etc/security/group.conf ” 来在身份验证过程中动态地将用户添加到组。 (请参阅 第 4 章,身份验证。) |
一些用于初级管理工作的目录:“/usr/local ”、“/home ” |
---|---|
sudo
|
您需要属于 dialout 组才能重新配置调制解调器、拨打任何地方等。 但是,如果 root 在 “/etc/ppp/peers/ ” 中为受信任的对等方创建了预定义的配置文件,则您只需要属于 dip 组即可使用 pppd(8)、pon(1) 和 poff(1) 命令创建与这些受信任对等方的 拨号 IP 连接。 |
一些著名的系统提供的组允许其成员在没有
|
表 1.8. 用于特定命令执行的著名系统提供组列表 |
组
可访问的命令
无需密码即可执行 sudo
![]() |
注意 |
---|---|
名称 |
描述
mtime
修改时间
![]() |
注意 |
---|---|
文件修改时间 ( |
ctime
状态更改时间
$ LANG=en_US.UTF-8 ls -l foo -rw-r--r-- 1 penguin penguin 3 2008-03-05 00:47 foo $ LANG=C ls -l foo -rw-r--r-- 1 penguin penguin 3 Mar 5 00:47 foo
![]() |
提示 |
---|---|
文件状态更改时间 ( |
访问时间
ctime 不是文件创建时间。
覆盖文件会更改文件的所有 mtime、ctime 和 atime 属性。
更改文件的所有权或权限会更改文件的 ctime 和 atime 属性。
读取文件会更改文件的 atime。
即使只是在 Debian 系统上读取文件,通常也会导致文件写入操作以更新 inode 中的 atime 信息。 使用 “noatime
” 或 “relatime
” 选项挂载文件系统会使系统跳过此操作,并加快读取的文件访问速度。 这通常是笔记本电脑的建议做法,因为它减少了硬盘驱动器的活动并节省了电量。 请参阅 mount(8)。
使用 touch(1) 命令更改现有文件的时间戳。
$ echo "Original Content" > foo $ ls -li foo 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 foo $ ln foo bar # hard link $ ln -s foo baz # symlink $ ls -li foo bar baz 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 foo $ rm foo $ echo "New Content" > foo $ ls -li foo bar baz 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398540 -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:17 foo $ cat bar Original Content $ cat baz New Content
对于时间戳,ls
命令在现代英语区域设置 (“en_US.UTF-8
”) 和旧区域设置 (“C
”) 下输出不同的字符串。
请参阅 第 9.2.5 节,“自定义时间和日期显示”,以自定义 “ls -l
” 输出。
![]() |
注意 |
---|---|
有两种方法可以将文件 “ |
硬链接
现有文件的重复名称
ln foo bar
”符号链接或软链接
指向另一个文件的特殊文件(按名称)
同上,针对其他
$ cd; mkfifo mypipe $ echo "hello" >mypipe & # put into background [1] 8022 $ ls -l mypipe prw-r--r-- 1 penguin penguin 0 2007-04-29 08:25 mypipe $ cat mypipe hello [1]+ Done echo "hello" >mypipe $ ls mypipe mypipe $ rm mypipe
ln -s foo bar
”有关链接计数的变化以及 rm
命令结果的细微差异,请参见以下示例。
![]() |
提示 |
---|---|
硬链接可以在同一文件系统内创建,并共享相同的 inode 编号,ls(1) 的 “ |
rwxrwxrwx
” 的标称文件访问权限,其有效访问权限由它指向的文件的权限决定。通常,最好不要创建复杂的符号链接或硬链接,除非您有非常好的理由。 符号链接的逻辑组合可能会导致文件系统中的循环,这可能会导致噩梦。
通常,最好使用符号链接而不是硬链接,除非您有充分的理由使用硬链接。
“.
” 目录链接到它所在的目录,因此任何新目录的链接计数都从 2 开始。“..
” 目录链接到父目录,因此目录的链接计数会随着添加新的子目录而增加。
如果您刚从 Windows 迁移到 Linux,那么很快就会清楚 Unix 的文件名链接设计得有多好,与 Windows 最接近的 “快捷方式” 相比。 因为它是在文件系统中实现的,所以应用程序看不到链接文件和原始文件之间的任何区别。 在硬链接的情况下,实际上没有任何区别。
命名管道是一个像管道一样的文件。 您将某些东西放入文件中,它会从另一端出来。 因此,它被称为 FIFO,或先进先出:您放入管道的第一件事就是从另一端出来的第一件事。
如果您写入命名管道,则写入管道的进程在写入的信息从管道中读取之前不会终止。 如果您从命名管道读取,则读取进程将等待直到没有要读取的内容才终止。 管道的大小始终为零 --- 它不存储数据,它只是像 shell “|
” 一样链接两个进程。 但是,由于此管道具有名称,因此这两个进程不必在同一命令行上,甚至不必由同一用户运行。 管道是 Unix 的一项非常有影响力的创新。
套接字被 Internet 通信、数据库和操作系统本身广泛使用。 它类似于命名管道 (FIFO),并允许进程甚至在不同计算机之间交换信息。 对于套接字,这些进程不需要同时运行,也不需要作为同一祖先进程的子进程运行。 这是 进程间通信 (IPC) 的端点。 信息交换可能发生在不同主机之间的网络上。 最常见的两个是 Internet 套接字 和 Unix 域套接字。
“netstat -an
” 提供了给定系统上打开的套接字的非常有用的概述。
![]() |
注意 |
---|---|
设备文件 指的是系统上的物理或虚拟设备,例如您的硬盘、显卡、屏幕或键盘。 虚拟设备的一个示例是控制台,由 “ |
设备文件有 2 种类型。
$ ls -l /dev/hda /dev/ttyS0 /dev/zero brw-rw---- 1 root cdrom 3, 0 2007-04-29 07:00 /dev/hda crw-rw---- 1 root dialout 4, 64 2007-04-29 07:00 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 2007-04-29 07:00 /dev/zero
字符设备
一次访问一个字符
1 个字符 = 1 字节
例如键盘设备、串行端口等…
以称为块的较大单位访问
1 块 > 1 字节
返回 “文件结尾 (EOF) 字符”
不返回任何内容(一个无底的数据转储坑)
/dev/zero
返回 “\0
(NUL) 字符”(与数字零 ASCII 不同)
![]() |
注意 |
---|---|
/dev/random |
从真正的随机数生成器返回随机字符,提供真正的熵(慢)
/dev/urandom
从加密安全的伪随机数生成器返回随机字符
返回磁盘已满 (ENOSPC) 错误
这些文件经常与 shell 重定向结合使用(请参阅 第 1.5.8 节,“典型命令序列和 shell 重定向”)。
“/proc/sys/
” 下的目录包含在运行时更改某些内核参数的接口。 (您可以通过专门的 sysctl(8) 命令或其预加载/配置文件 “/etc/sysctrl.conf
” 执行相同的操作。)
file-max
” 值增加到更大的值来解决此问题,例如,“echo "65536" > /proc/sys/fs/file-max
”(这在较旧的内核上是必需的)。当人们注意到一个特别的文件 - “/proc/kcore
” - 通常很大时,他们经常会感到恐慌。 这(或多或少)是您计算机内存内容的副本。 它用于调试内核。 这是一个指向计算机内存的虚拟文件,因此不必担心其大小。
“/sys
” 下的目录包含导出的内核数据结构、它们的属性以及它们之间的链接。 它还包含在运行时更改某些内核参数的接口。
$ sudo apt-get install mc
请参阅 Linux 内核文档(linux-doc-2.6.*
软件包提供的 “/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
”)中的 “proc.txt(.gz)
”、“sysfs.txt(.gz)
” 和其他相关文档。
tmpfs 是一个临时文件系统,它将所有文件保存在虚拟内存中。 内存中 页面缓存 中的 tmpfs 数据可以根据需要交换到磁盘上的 交换空间。
目录 “/run
” 在早期启动过程中挂载为 tmpfs。 即使目录 “/
” 以只读方式挂载,这也可以对其进行写入。 这是用于存储瞬态状态文件的新位置,并取代了 文件系统层次结构标准 版本 2.3 中描述的几个位置
“/var/run
” → “/run
”
/var/lock
” → “/run/lock
”“/dev/shm
” → “/run/shm
”
. /usr/lib/mc/mc.sh
请参阅 Linux 内核文档(linux-doc-*
软件包提供的 “/usr/share/doc/linux-doc-*/Documentation/filesystems/*
”)中的 “tmpfs.txt(.gz)
”。
Midnight Commander (MC) 是用于 Linux 控制台和其他终端环境的 GNU “瑞士军刀”。 这为新手提供了菜单驱动的控制台体验,与标准的 Unix 命令相比,它更容易学习。
$ mc
您可能需要通过以下方式安装名为 “mc
” 的 Midnight Commander 软件包。
![]() |
注意 |
---|---|
使用 mc(1) 命令探索 Debian 系统。 这是最好的学习方法。 请仅使用光标键和 Enter 键探索一些有趣的位置。 |
“/etc
” 及其子目录
“/var/log
” 及其子目录
/usr/share/doc
” 及其子目录默认是包含文件列表的两个目录面板。另一种有用的模式是将右侧窗口设置为“信息”,以查看文件访问权限信息等。以下是一些必要的按键操作。如果 gpm(8) 守护进程正在运行,也可以在 Linux 字符控制台中使用鼠标。(请务必按住 Shift 键以获得 MC 中剪切和粘贴的正常行为。)
表 1.11. MC 的按键绑定
按键 | 按键绑定 |
---|---|
F1
|
帮助菜单 |
F3
|
内部文件查看器 |
F4
|
内部编辑器 |
F9
|
激活下拉菜单 |
F10
|
退出 Midnight Commander |
Tab
|
在两个窗口之间移动 |
Insert 或 Ctrl-T |
标记文件以进行多文件操作,例如复制 |
Del
|
删除文件(请小心---将 MC 设置为安全删除模式) |
光标键 | 不言自明 |
cd
命令更改所选屏幕上显示的目录。
Ctrl-Enter
或 Alt-Enter
将文件名复制到命令行。将此与 cp(1) 和 mv(1) 命令以及命令行编辑一起使用。
Alt-Tab
显示 shell 文件名扩展选项。
可以为 MC 的两个窗口指定起始目录作为参数;例如,“mc /etc /root
”。
Esc
+ n-key
→ Fn
(即,Esc
+ 1
→ F1
,等等;Esc
+ 0
→ F10
)
在按键之前按 Esc
键与同时按下 Alt
键和该键具有相同的效果。即,键入 Esc
+ c
表示 Alt-C
。Esc
被称为 meta 键,有时记为“M-
”。
内部编辑器具有有趣的剪切和粘贴方案。按下 F3
标记选择的开始,第二次按下 F3
标记选择的结束并高亮显示选择。然后您可以移动光标。如果按下 F6,选定的区域将移动到光标位置。如果按下 F5,选定的区域将被复制并插入到光标位置。F2
保存文件。F10
退出。大多数光标键都能直观地工作。
可以使用以下命令之一直接在文件上启动此编辑器。
$ mc -e filename_to_edit
$ mcedit filename_to_edit
这不是一个多窗口编辑器,但可以使用多个 Linux 控制台来实现相同的效果。要在窗口之间复制,请使用 Alt-F<n> 键切换虚拟控制台,并使用“文件→插入文件”或“文件→复制到文件”将文件的一部分移动到另一个文件。
此内部编辑器可以替换为任何外部编辑器。
此外,许多程序使用环境变量“$EDITOR
”或“$VISUAL
”来决定使用哪个编辑器。如果您最初不熟悉 vim(1) 或 nano(1),您可以将这些设置为“mcedit
”,方法是将以下行添加到“~/.bashrc
”中。
export EDITOR=mcedit export VISUAL=mcedit
我强烈建议尽可能将这些设置为“vim
”。
如果您不熟悉 vim(1),您可以继续使用 mcedit(1) 执行大多数系统维护任务。
MC 是一个非常智能的查看器。这是一个在文档中搜索单词的绝佳工具。我总是将此用于“/usr/share/doc
”目录中的文件。这是浏览大量 Linux 信息的最快方法。可以使用以下命令之一直接启动此查看器。
$ mc -v path/to/filename_to_view
$ mcview path/to/filename_to_view
在文件上按 Enter 键,相应的程序将处理文件的内容(请参阅第 9.5.11 节,“自定义要启动的程序”)。这是一个非常方便的 MC 功能。
表 1.12. 在 MC 中对 Enter 键的反应
文件类型 | 对 Enter 键的反应 |
---|---|
可执行文件 | 执行命令 |
man 文件 | 将内容管道传输到查看器软件 |
html 文件 | 将内容管道传输到 Web 浏览器 |
“*.tar.gz ”和“*.deb ”文件 |
浏览其内容,就像子目录一样 |
为了使这些查看器和虚拟文件功能正常工作,可查看文件不应设置为可执行文件。使用 chmod(1) 或通过 MC 文件菜单更改其状态。
尽管 MC 使您几乎可以完成所有操作,但学习如何使用从 shell 提示符调用的命令行工具并熟悉类 Unix 工作环境非常重要。
您可以使用 chsh(1) 选择您的登录 shell。
表 1.13. shell 程序列表
软件包 | popcon | 大小 | POSIX shell | 描述 |
---|---|---|---|---|
bash
|
http://qa.debian.org/popcon.php?package=bash | 3935 | 是 | Bash:GNU Bourne Again SHell(事实上的标准) |
tcsh
|
http://qa.debian.org/popcon.php?package=tcsh | 1213 | 否 | TENEX C Shell:Berkeley csh 的增强版本 |
dash
|
http://qa.debian.org/popcon.php?package=dash | 212 | 是 | Debian Almquist Shell,适用于 shell 脚本 |
zsh
|
http://qa.debian.org/popcon.php?package=zsh | 11462 | 是 | Z shell:具有许多增强功能的标准 shell |
pdksh
|
http://qa.debian.org/popcon.php?package=pdksh | 388 | 是 | Korn shell 的公共域版本 |
csh
|
http://qa.debian.org/popcon.php?package=csh | 340 | 否 | OpenBSD C Shell,Berkeley csh 的一个版本 |
sash
|
http://qa.debian.org/popcon.php?package=sash | 946 | 是 |
具有内置命令的独立 shell(不适用于标准“/bin/sh ”) |
ksh
|
http://qa.debian.org/popcon.php?package=ksh | 3105 | 是 | Korn shell 的真实 AT&T 版本 |
rc
|
http://qa.debian.org/popcon.php?package=rc | 169 | 否 | AT&T Plan 9 rc shell 的实现 |
posh
|
http://qa.debian.org/popcon.php?package=posh | 201 | 是 | 策略兼容的普通 SHell(pdksh 衍生版本) |
在本教程章节中,交互式 shell 始终表示 bash
。
您可以通过“~/.bashrc
”自定义 bash(1) 的行为。
例如,尝试以下操作。
# CD upon exiting MC . /usr/lib/mc/mc.sh # set CDPATH to good one CDPATH=.:/usr/share/doc:~:~/Desktop:~ export CDPATH PATH="${PATH}":/usr/sbin:/sbin # set PATH so it includes user's private bin if it exists if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi export PATH EDITOR=vim export EDITOR
![]() |
提示 |
---|---|
您可以在 第 9 章,系统技巧中找到更多 |
在类 Unix 环境中,有一些具有特殊含义的按键。请注意,在普通的 Linux 字符控制台上,只有左侧的 Ctrl
和 Alt
键才能按预期工作。以下是一些值得记住的著名按键。
表 1.14. bash 的按键绑定列表
按键 | 按键绑定的描述 |
---|---|
Ctrl-U
|
擦除光标前的行 |
Ctrl-H
|
擦除光标前的一个字符 |
Ctrl-D
|
终止输入(如果您正在使用 shell,则退出 shell) |
Ctrl-C
|
终止正在运行的程序 |
Ctrl-Z
|
通过将程序移动到后台作业来临时停止程序 |
Ctrl-S
|
暂停输出到屏幕 |
Ctrl-Q
|
重新激活输出到屏幕 |
Ctrl-Alt-Del
|
重启/停止系统,请参阅 inittab(5) |
左 Alt 键 (可选,Windows 键 ) |
Emacs 和类似 UI 的 meta 键 |
向上箭头键
|
在 bash 下启动命令历史记录搜索 |
Ctrl-R
|
在 bash 下启动增量命令历史记录搜索 |
Tab
|
在 bash 下完成命令行上的文件名输入 |
Ctrl-V Tab |
在 bash 下输入 Tab 而不扩展到命令行 |
![]() |
提示 |
---|---|
|
类 Unix 风格的鼠标操作基于 3 按钮鼠标系统。
表 1.15. 类 Unix 风格的鼠标操作列表
您可以读取和写入设备文件,尽管该文件很可能包含二进制数据,这些数据对于人类来说可能是无法理解的乱码。 将数据直接写入这些文件有时对于硬件连接的故障排除很有用。 例如,您可以将文本文件转储到打印机设备 “/dev/lp0 ” 或将调制解调器命令发送到相应的串行端口 “/dev/ttyS0 ”。 但是,除非小心地执行此操作,否则可能会导致重大灾难。 因此请谨慎。 |
响应 |
---|---|
鼠标左键单击并拖动 | 选择并复制到剪贴板 |
鼠标左键单击 | 选择选择的开始位置 |
鼠标右键单击 | 选择选择的结束位置并复制到剪贴板 |
鼠标中键单击 | 在光标处粘贴剪贴板内容 |
现代滚轮鼠标上的中心滚轮被认为是鼠标中键,可以用于中键单击。在 2 按钮鼠标系统的情况下,同时单击鼠标左右键可作为中键单击。为了在 Linux 字符控制台中使用鼠标,您需要运行 gpm(8) 作为守护进程。
less(1) 是增强的分页器(文件内容浏览器)。按“h
”获取帮助。它可以比 more(1) 做更多的事情,并且可以通过在 shell 启动脚本中执行“eval $(lesspipe)
”或“eval $(lessfile)
”来增强功能。有关更多信息,请参阅“/usr/share/doc/lessf/LESSOPEN
”。“-R
”选项允许原始字符输出并启用 ANSI 彩色转义序列。请参阅 less(1)。
您应该精通 Vim 或 Emacs 程序的变体之一,这些程序在类 Unix 系统中很流行。
我认为习惯 Vim 命令是正确的做法,因为 Vi 编辑器始终存在于 Linux/Unix 世界中。(实际上,原始的 vi
或新的 nvi
是您随处可见的程序。我为新手选择了 Vim,因为它通过 F1
键为您提供帮助,同时它足够相似且功能更强大。)
如果您选择 Emacs 或 XEmacs 作为您的编辑器选择,那确实是另一个不错的选择,特别是对于编程而言。Emacs 还具有大量其他功能,包括充当新闻阅读器、目录编辑器、邮件程序等。当用于编程或编辑 shell 脚本时,它可以智能地识别您正在处理的格式,并尝试提供帮助。有些人认为他们在 Linux 上唯一需要的程序是 Emacs。现在学习 Emacs 十分钟可以在以后节省数小时。强烈建议在学习 Emacs 时参考 GNU Emacs 手册。
所有这些程序通常都附带辅导程序,供您通过实践学习它们。通过键入“vim
”并按 F1 键启动 Vim。您至少应该阅读前 35 行。然后通过将光标移动到“|tutor|
”并按下 Ctrl-]
来进行在线培训课程。
![]() |
注意 |
---|---|
诸如 Vim 和 Emacs 之类的优秀编辑器可以与 UTF-8 语言环境和适当的字体设置下的 X 终端模拟器中的适当选项一起使用,以正确处理 UTF-8 和其他外来编码文本。请参阅其关于多字节文本的文档。 |
Debian 附带了许多不同的编辑器。我们建议安装 vim
软件包,如上所述。
Debian 通过命令“/usr/bin/editor
”提供对系统默认编辑器的统一访问,以便其他程序(例如,reportbug(1))可以调用它。您可以通过以下方式更改它。
$ sudo update-alternatives --config editor
对于新手,我推荐选择“/usr/bin/vim.basic
”而不是“/usr/bin/vim.tiny
”,因为它支持语法高亮显示。
![]() |
提示 |
---|---|
许多程序使用环境变量“ |
您可以通过“~/.vimrc
”自定义 vim(1) 的行为。
同上,针对其他
" ------------------------------- " Local configuration " set nocompatible set nopaste set pastetoggle=<f2> syn on if $USER == "root" set nomodeline set noswapfile else set modeline set swapfile endif " filler to avoid the line above being recognized as a modeline " filler " filler
shell 命令的输出可能会滚出您的屏幕,并且可能会永久丢失。将 shell 活动记录到文件中以便稍后查看是一个好的做法。当您执行任何系统管理任务时,这种记录至关重要。
记录 shell 活动的基本方法是在 script(1) 下运行它。
同上,针对其他
$ script Script started, file is typescript
在 script
下执行任何 shell 命令。
按 Ctrl-D
退出 script
。
$ vim typescript
让我们学习基本的 Unix 命令。在这里,我以通用意义使用“Unix”。任何 Unix 克隆操作系统通常都提供等效的命令。Debian 系统也不例外。如果某些命令现在无法按您希望的方式工作,请不要担心。如果在 shell 中使用了 alias
,则其相应的命令输出将有所不同。这些示例并非旨在按此顺序执行。
从非特权用户帐户尝试以下所有命令。
表 1.16. 基本 Unix 命令列表
命令 | 描述 |
---|---|
pwd
|
显示当前/工作目录的名称 |
whoami
|
显示当前用户名 |
id
|
显示当前用户身份(名称、uid、gid 和关联组) |
file <foo>
|
显示文件“<foo> ”的文件类型 |
type -p <commandname>
|
显示命令“<commandname> ”的文件位置 |
which <commandname>
|
, , |
type <commandname>
|
显示有关命令“<commandname> ”的信息 |
apropos <key-word>
|
查找与“<key-word> ”相关的命令 |
man -k <key-word>
|
, , |
whatis <commandname>
|
显示有关命令“<commandname> ”的单行解释 |
man -a <commandname>
|
显示有关命令“<commandname> ”的解释(Unix 风格) |
info <commandname>
|
显示有关命令“<commandname> ”的相当长的解释(GNU 风格) |
ls
|
列出目录内容(非点文件和目录) |
ls -a
|
列出目录内容(所有文件和目录) |
ls -A
|
列出目录内容(几乎所有文件和目录,即跳过“.. ”和“. ”) |
ls -la
|
列出目录的所有内容,并提供详细信息 |
ls -lai
|
列出目录的所有内容,并提供 inode 编号和详细信息 |
ls -d
|
列出当前目录下的所有目录 |
tree
|
显示文件树内容 |
lsof <foo>
|
列出文件“<foo> ”的打开状态 |
lsof -p <pid>
|
列出进程 ID 为“<pid> ”的进程打开的文件 |
mkdir <foo>
|
在当前目录中创建新目录“<foo> ” |
rmdir <foo>
|
删除当前目录中的目录“<foo> ” |
cd <foo>
|
将目录更改为当前目录或变量“$CDPATH ”中列出的目录中的目录“<foo> ” |
cd /
|
将目录更改为根目录 |
cd
|
将目录更改为当前用户的 home 目录 |
cd /<foo>
|
将目录更改为绝对路径目录“/<foo> ” |
cd ..
|
将目录更改为父目录 |
cd ~<foo>
|
将目录更改为用户“<foo> ”的 home 目录 |
cd -
|
将目录更改为上一个目录 |
</etc/motd pager
|
使用默认分页器显示“/etc/motd ”的内容 |
touch <junkfile>
|
创建一个空文件“<junkfile> ” |
cp <foo> <bar>
|
将现有文件“<foo> ”复制到新文件“<bar> ” |
rm <junkfile>
|
删除文件“<junkfile> ” |
mv <foo> <bar>
|
将现有文件“<foo> ”重命名为新名称“<bar> ”(“<bar> ”必须不存在) |
mv <foo> <bar>
|
将现有文件“<foo> ”移动到新位置“<bar>/<foo> ”(目录“<bar> ”必须存在) |
mv <foo> <bar>/<baz>
|
将现有文件“<foo> ”移动到具有新名称“<bar>/<baz> ”的新位置(目录“<bar> ”必须存在,但目录“<bar>/<baz> ”必须不存在) |
chmod 600 <foo>
|
使现有文件“<foo> ”对其他人不可读且不可写(对所有人不可执行) |
chmod 644 <foo>
|
使现有文件“<foo> ”对其他人可读但不可写(对所有人不可执行) |
chmod 755 <foo>
|
使现有文件“<foo> ”对其他人可读但不可写(对所有人可执行) |
find . -name <pattern>
|
使用 shell “<pattern> ”查找匹配的文件名(较慢) |
locate -d . <pattern>
|
使用 shell “<pattern> ”查找匹配的文件名(使用定期生成的数据库更快) |
grep -e "<pattern>" *.html
|
在当前目录中查找所有以“.html ”结尾的文件中的“<pattern> ”并显示它们 |
top
|
使用全屏显示进程信息,键入“q ”退出 |
ps aux | pager
|
使用 BSD 风格的输出显示有关所有正在运行的进程的信息 |
ps -ef | pager
|
使用 Unix system-V 风格的输出显示有关所有正在运行的进程的信息 |
ps aux | grep -e "[e]xim4*"
|
显示所有正在运行的“exim ”和“exim4 ”进程 |
ps axf | pager
|
使用 ASCII 艺术输出显示有关所有正在运行的进程的信息 |
kill <1234>
|
终止进程 ID 为“<1234>”的进程 |
gzip <foo>
|
使用 Lempel-Ziv 编码 (LZ77) 压缩“<foo> ”以创建“<foo>.gz ” |
gunzip <foo>.gz
|
解压缩“<foo>.gz ”以创建“<foo> ” |
bzip2 <foo>
|
使用 Burrows-Wheeler 块排序文本压缩算法和 Huffman 编码压缩“<foo> ”以创建“<foo>.bz2 ”(比 gzip 更好的压缩) |
bunzip2 <foo>.bz2
|
解压缩“<foo>.bz2 ”以创建“<foo> ” |
xz <foo>
|
使用 Lempel–Ziv–Markov 链算法压缩“<foo> ”以创建“<foo>.xz ”(比 bzip2 更好的压缩) |
unxz <foo>.xz
|
解压缩“<foo>.xz ”以创建“<foo> ” |
tar -xvf <foo>.tar
|
从“<foo>.tar ”存档中提取文件 |
tar -xvzf <foo>.tar.gz
|
从 gzipped “<foo>.tar.gz ”存档中提取文件 |
tar -xvjf <foo>.tar.bz2
|
从“<foo>.tar.bz2 ”存档中提取文件 |
tar -xvJf <foo>.tar.xz
|
从“<foo>.tar.xz ”存档中提取文件 |
tar -cvf <foo>.tar <bar>/
|
在“<foo>.tar ”存档中存档文件夹“<bar>/ ”的内容 |
tar -cvzf <foo>.tar.gz <bar>/
|
在压缩的“<foo>.tar.gz ”存档中存档文件夹“<bar>/ ”的内容 |
tar -cvjf <foo>.tar.bz2 <bar>/
|
在“<foo>.tar.bz2 ”存档中存档文件夹“<bar>/ ”的内容 |
tar -cvJf <foo>.tar.xz <bar>/
|
在“<foo>.tar.xz ”存档中存档文件夹“<bar>/ ”的内容 |
zcat README.gz | pager
|
使用默认分页器显示压缩的“README.gz ”的内容 |
zcat README.gz > foo
|
使用“README.gz ”的解压缩内容创建文件“foo ” |
zcat README.gz >> foo
|
将“README.gz ”的解压缩内容附加到文件“foo ”的末尾(如果文件不存在,则首先创建它) |
![]() |
注意 |
---|---|
Unix 有隐藏以“ |
![]() |
注意 |
---|---|
有关 |
![]() |
注意 |
---|---|
裸机 Debian 系统的默认分页器是 more(1),它无法向后滚动。通过使用命令行“ |
![]() |
注意 |
---|---|
上面“ |
请遍历目录并使用上述命令查看系统作为培训。如果您对任何控制台命令有疑问,请务必阅读手册页。
同上,针对其他
$ man man $ man bash $ man builtins $ man grep $ man ls
手册页的风格可能有点难以适应,因为它们相当简洁,尤其是较旧的、非常传统的那些。但是一旦您习惯了它,您就会欣赏它们的简洁性。
请注意,许多类 Unix 命令(包括来自 GNU 和 BSD 的命令)在您以下列方式之一调用它们时(或在某些情况下不带任何参数)会显示简短的帮助信息。
$ <commandname> --help $ <commandname> -h
现在您对如何使用 Debian 系统有了一些了解。让我们深入了解 Debian 系统中命令执行的机制。在这里,我为新手简化了现实。有关确切的解释,请参阅 bash(1)。
一个简单的命令是一系列组件。
变量赋值(可选)
命令名称
参数(可选)
重定向(可选:>
、>>
、<
、<<
等)
控制运算符(可选:&&
、||
、<换行符>、;
、&
、(
、)
)
某些环境变量的值会更改某些 Unix 命令的行为。
环境变量的默认值最初由 PAM 系统设置,然后其中一些可能会被某些应用程序重置。
诸如 gdm3
之类的显示管理器会重置环境变量。
shell 在其启动代码中重置“~/bash_profile
”和“~/.bashrc
”中的环境变量。
赋予“$LANG
”变量的完整区域设置值由 3 部分组成:“xx_YY.ZZZZ
”。
表 1.17. 区域设置值的 3 部分
区域设置值 | 含义 |
---|---|
xx
|
ISO 639 语言代码(小写),例如 “en” |
YY
|
ISO 3166 国家代码(大写),例如 “US” |
ZZZZ
|
字符集,始终设置为 “UTF-8” |
关于语言代码和国家代码,请参阅“info gettext
”中的相关描述。
对于现代 Debian 系统上的字符集,您应该始终将其设置为 UTF-8
,除非您有充分的理由和背景知识,并且特别想使用历史字符集。
有关区域设置配置的详细信息,请参阅第 8.3 节,“区域设置”。
![]() |
注意 |
---|---|
“ |
表 1.18. 区域设置建议列表
区域设置建议 | 语言(地区) |
---|---|
en_US.UTF-8
|
英语(美国) |
en_GB.UTF-8
|
英语(英国) |
fr_FR.UTF-8
|
法语(法国) |
de_DE.UTF-8
|
德语(德国) |
it_IT.UTF-8
|
意大利语(意大利) |
es_ES.UTF-8
|
西班牙语(西班牙) |
ca_ES.UTF-8
|
加泰罗尼亚语(西班牙) |
sv_SE.UTF-8
|
瑞典语(瑞典) |
pt_BR.UTF-8
|
葡萄牙语(巴西) |
ru_RU.UTF-8
|
俄语(俄罗斯) |
zh_CN.UTF-8
|
中文(中国) |
zh_TW.UTF-8
|
中文(台湾,中华民国) |
ja_JP.UTF-8
|
日语(日本) |
ko_KR.UTF-8
|
韩语(韩国) |
vi_VN.UTF-8
|
越南语(越南) |
典型的命令执行使用如下所示的 shell 命令行序列。
$ date Sun Jun 3 10:27:39 JST 2007 $ LANG=fr_FR.UTF-8 date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
在此,程序 date(1) 使用环境变量 “$LANG
” 的不同值执行。
大多数命令执行通常没有前面的环境变量定义。对于上面的示例,您可以选择如下执行。
$ LANG=fr_FR.UTF-8 $ date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
正如您在此处看到的,命令的输出受到环境变量的影响,从而产生法语输出。如果您希望环境变量继承到子进程(例如,在调用 shell 脚本时),您需要通过以下方式 导出 它。
$ export LANG
![]() |
提示 |
---|---|
提交错误报告时,如果您使用非英语环境,则在 “ |
有关 “$LANG
” 和相关的环境变量,请参阅 locale(5) 和 locale(7)。
![]() |
注意 |
---|---|
我建议您仅通过 “ |
当您在 shell 中键入命令时,shell 会在 “$PATH
” 环境变量中包含的目录列表中搜索该命令。“$PATH
” 环境变量的值也称为 shell 的搜索路径。
在默认的 Debian 安装中,用户帐户的 “$PATH
” 环境变量可能不包含 “/sbin
” 和 “/usr/sbin
”。例如,ifconfig
命令需要使用完整路径发出,如 “/sbin/ifconfig
”。(类似的 ip
命令位于 “/bin
” 中。)
您可以通过 “~/.bash_profile
” 或 “~/.bashrc
” 文件更改 Bash shell 的 “$PATH
” 环境变量。
许多命令将用户特定的配置存储在主目录中,并通过其内容更改其行为。主目录由环境变量 “$HOME
” 标识。
表 1.19. “$HOME
” 值列表
“$HOME ” 的值 |
程序执行情况 |
---|---|
/
|
init 进程(守护进程)运行的程序 |
/root
|
从正常的 root shell 运行的程序 |
/home/<normal_user>
|
从普通用户 shell 运行的程序 |
/home/<normal_user>
|
从普通用户 GUI 桌面菜单运行的程序 |
/home/<normal_user>
|
以 root 身份运行的程序,使用 “sudo program ” |
/root
|
以 root 身份运行的程序,使用 “sudo -H program ” |
![]() |
提示 |
---|---|
Shell 将 “ |
一些命令接受参数。以 “-
” 或 “--
” 开头的参数称为选项,并控制命令的行为。
$ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100
在此,命令行参数 “-R
” 更改 date(1) 的行为以输出符合 RFC2822 规范的日期字符串。
通常,您希望命令处理一组文件,而无需键入所有文件名。使用 shell glob(有时称为 通配符)的文件名扩展模式可以满足此需求。
表 1.20. Shell glob 模式
shell glob 模式 | 匹配规则的描述 |
---|---|
*
|
文件名(段)不是以 “. ” 开头 |
.*
|
文件名(段)以 “. ” 开头 |
?
|
? |
[…]
|
恰好一个字符,可以是方括号中包含的任何字符 |
[a-z]
|
恰好一个字符,可以是 “a ” 和 “z ” 之间的任何字符 |
[^…]
|
恰好一个字符,但不能是方括号中包含的任何字符(不包括 “^ ”) |
同上,针对其他
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt ..6.txt $ echo .*[^.]* .5.txt ..6.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf junk
请参阅 glob(7)。
![]() |
注意 |
---|---|
与 shell 的正常文件名扩展不同,在 find(1) 中使用 “ |
![]() |
注意 |
---|---|
可以调整 BASH 以使用其 shopt 内置选项(如 “ |
每个命令都将其退出状态(变量:“$?
”)作为返回值返回。
例如,尝试以下操作。
$ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1
![]() |
注意 |
---|---|
请注意,在 shell 的逻辑上下文中,成功 被视为逻辑 TRUE,其值为 0(零)。这有点违反直觉,需要在此处提醒。 |
让我们尝试记住以下 shell 命令习惯用法,这些习惯用法在一行中键入,作为 shell 命令的一部分。
表 1.22. Shell 命令习惯用法
命令习惯用法 | 描述 |
---|---|
command &
|
在子 shell 中command 的后台执行 |
command1 | command2
|
将 command1 的标准输出 管道 传输到 command2 的标准输入(并发执行) |
command1 2>&1 | command2
|
将 command1 的标准输出和标准错误都 管道 传输到 command2 的标准输入(并发执行) |
command1 ; command2
|
顺序执行 command1 和 command2 |
command1 && command2
|
执行 command1 ;如果成功,则 顺序 执行 command2 (如果 command1 和 command2 都成功,则返回成功) |
command1 || command2
|
执行 command1 ;如果不成功,则 顺序 执行 command2 (如果 command1 或 command2 成功,则返回成功) |
command > foo
|
将 command 的标准输出重定向到文件 foo (覆盖) |
command 2> foo
|
将 command 的标准错误重定向到文件 foo (覆盖) |
command >> foo
|
将 command 的标准输出重定向到文件 foo (追加) |
command 2>> foo
|
将 command 的标准错误重定向到文件 foo (追加) |
command > foo 2>&1
|
将 command 的标准输出和标准错误都重定向到文件 “foo ” |
command < foo
|
将 command 的标准输入重定向到文件 foo |
command << delimiter
|
将 command 的标准输入重定向到以下行,直到遇到 “delimiter ”(here document) |
command <<- delimiter
|
将 command 的标准输入重定向到以下行,直到遇到 “delimiter ”(here document,输入行中前导的制表符字符被剥离) |
Debian 系统是一个多任务系统。后台作业允许用户在单个 shell 中运行多个程序。后台进程的管理涉及 shell 内置命令:jobs
、fg
、bg
和 kill
。请阅读 bash(1) 中 “SIGNALS” 和 “JOB CONTROL” 部分,以及 builtins(1)。
同上,针对其他
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
尽管 shell 重定向的 4 个示例都显示相同的内容,但最后一个示例运行了一个额外的 cat
命令,并且毫无理由地浪费了资源。
shell 允许您使用 exec
内置命令和任意文件描述符打开文件。
$ echo Hello >foo $ exec 3<foo 4>bar # open files $ cat <&3 >&4 # redirect stdin to 3, stdout to 4 $ exec 3<&- 4>&- # close files $ cat bar Hello
在此,“n<&-
” 和 “n>&-
” 表示关闭文件描述符 “n
”。
文件描述符 0-2 是预定义的。
您可以为常用命令设置别名。
同上,针对其他
$ alias la='ls -la'
现在,“la
” 可以作为 “ls -la
” 的简写形式,它以长列表格式列出所有文件。
您可以使用 alias
列出任何现有的别名(请参阅 bash(1) 中的 “SHELL BUILTIN COMMANDS”)。
$ alias ... alias la='ls -la'
您可以使用 type
标识命令的确切路径或身份(请参阅 bash(1) 中的 “SHELL BUILTIN COMMANDS”)。
同上,针对其他
$ type ls ls is hashed (/bin/ls) $ type la la is aliased to ls -la $ type echo echo is a shell builtin $ type file file is /usr/bin/file
这里,ls
最近被搜索过,而 “file
” 没有,因此 “ls
” 是 “hashed”,即 shell 具有一个内部记录,用于快速访问 “ls
” 命令的位置。
![]() |
提示 |
---|---|
请参阅第 9.2.7 节,“彩色命令”。 |
在类 Unix 工作环境中,文本处理是通过将文本通过标准文本处理工具链进行管道传输来完成的。这是 Unix 的另一项关键创新。
在类 Unix 系统上,有一些常用的标准文本处理工具。
未使用正则表达式
cat(1) 连接文件并输出全部内容。
tac(1) 连接文件并反向输出。
cut(1) 选择行的一部分并输出。
head(1) 输出文件的开头部分。
tail(1) 输出文件的结尾部分。
sort(1) 对文本文件行进行排序。
uniq(1) 从已排序文件中删除重复行。
tr(1) 转换或删除字符。
diff(1) 逐行比较文件。
使用基本正则表达式 (BRE)
grep(1) 使用模式匹配文本。
ed(1) 是一个原始的行编辑器。
sed(1) 是一个流编辑器。
vim(1) 是一个屏幕编辑器。
emacs(1) 是一个屏幕编辑器。(某种程度上扩展的 BRE)
使用扩展正则表达式 (ERE)
egrep(1) 使用模式匹配文本。
awk(1) 执行简单的文本处理。
tcl(3tcl) 可以执行所有可以想象的文本处理:re_syntax(3)。通常与 tk(3tk) 一起使用。
perl(1) 可以执行所有可以想象的文本处理。perlre(1)。
来自 pcregrep
包的 pcregrep(1) 使用 Perl 兼容正则表达式 (PCRE) 模式匹配文本。
带有 re
模块的 python(1) 可以执行所有可以想象的文本处理。请参阅 “/usr/share/doc/python/html/index.html
”。
如果您不确定这些命令具体做什么,请使用 “man command
” 自行查阅。
![]() |
注意 |
---|---|
排序顺序和范围表达式依赖于区域设置。如果您希望获得命令的传统行为,请使用 C 区域设置而不是 UTF-8 区域设置,方法是在命令前面加上 “ |
![]() |
注意 |
---|---|
Perl 正则表达式 (perlre(1))、Perl 兼容正则表达式 (PCRE) 和 Python |
正则表达式在许多文本处理工具中使用。它们类似于 shell glob,但更复杂和强大。
正则表达式描述了匹配模式,由文本字符和 元字符 组成。
元字符 只是一个具有特殊含义的字符。根据上面描述的文本工具,主要有两种样式:BRE 和 ERE。
表 1.24. BRE 和 ERE 的元字符
BRE | ERE | 正则表达式的描述 |
---|---|---|
\ . [ ] ^ $ *
|
\ . [ ] ^ $ *
|
通用 元字符 |
\+ \? \( \) \{ \} \|
|
BRE 仅 "\ " 转义的 元字符 |
|
+ ? ( ) { } |
|
ERE 仅非 “\ ” 转义的 元字符 |
|
l
|
l
|
匹配 非元字符 “c ” |
\c
|
\c
|
匹配文字字符 “c ”,即使 “c ” 本身是 元字符 |
.
|
.
|
. |
^
|
^
|
^ |
$
|
$
|
$ |
\<
|
\<
|
\< |
\>
|
\>
|
\> |
\[abc…\]
|
[abc…]
|
匹配 “abc… ” 中的任何字符 |
\[^abc…\]
|
[^abc…]
|
匹配除 “abc… ” 之外的任何字符 |
r*
|
r*
|
匹配零个或多个由 “r ” 标识的正则表达式 |
r\+
|
r+
|
匹配一个或多个由 “r ” 标识的正则表达式 |
r\?
|
r?
|
匹配零个或一个由 “r ” 标识的正则表达式 |
r1\|r2
|
r1|r2
|
匹配由 “r1 ” 或 “r2 ” 标识的正则表达式之一 |
\(r1\|r2\)
|
(r1|r2)
|
匹配由 “r1 ” 或 “r2 ” 标识的正则表达式之一,并将其视为 带括号的 正则表达式 |
emacs
的正则表达式基本上是 BRE,但已扩展为将 “+
” 和 “?
” 视为 ERE 中的 元字符。因此,在 emacs
的正则表达式中,无需使用 “\
” 转义它们。
grep(1) 可用于使用正则表达式执行文本搜索。
同上,针对其他
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program
![]() |
提示 |
---|---|
请参阅第 9.2.7 节,“彩色命令”。 |
对于替换表达式,某些字符具有特殊含义。
对于 Perl 替换字符串,使用 “$n
” 代替 “\n
”,并且 “&
” 没有特殊含义。
同上,针对其他
$ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&=
在此,请特别注意 带括号的 正则表达式的样式,以及匹配的字符串如何在不同工具的文本替换过程中使用。
这些正则表达式也可用于某些编辑器中的光标移动和文本替换操作。
shell 命令行末尾的反斜杠 “\
” 将换行符转义为空格字符,并将 shell 命令行输入延续到下一行。
请阅读所有相关的手册页以学习这些命令。
ed(1) 命令可以将 “file
” 中所有出现的 “FROM_REGEX
” 替换为 “TO_TEXT
”。
$ ed file <<EOF ,s/FROM_REGEX/TO_TEXT/g w q EOF
sed(1) 命令可以将 “file
” 中所有出现的 “FROM_REGEX
” 替换为 “TO_TEXT
”。
$ sed -ie 's/FROM_REGEX/TO_TEXT/g' file
vim(1) 命令可以使用 ex(1) 命令将 “file
” 中所有出现的 “FROM_REGEX
” 替换为 “TO_TEXT
”。
$ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+w' '+q' file
![]() |
提示 |
---|---|
上面代码中的 “ |
可以使用 vim(1) 或 perl(1) 使用正则表达式类似地处理多个文件(“file1
”、“file2
” 和 “file3
”)。
$ vim '+argdo %s/FROM_REGEX/TO_TEXT/ge|update' '+q' file1 file2 file3
![]() |
提示 |
---|---|
上面代码中的 “ |
$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3
在 perl(1) 示例中,“-i
” 用于就地编辑,“-p
” 用于文件上的隐式循环。
![]() |
提示 |
---|---|
使用参数 “ |
![]() |
注意 |
---|---|
ed(1) 和 vim(1) 是 BRE;perl(1) 是 ERE。 |
让我们考虑一个名为 “DPL
” 的文本文件,其中列出了一些 2004 年之前的 Debian 项目负责人姓名及其上任日期,格式以空格分隔。
Ian Murdock August 1993 Bruce Perens April 1996 Ian Jackson January 1998 Wichert Akkerman January 1999 Ben Collins April 2001 Bdale Garbee April 2002 Martin Michlmayr March 2003
![]() |
提示 |
---|---|
有关最新的 “Debian 简史”,请访问 Debian 领导层历史。 |
Awk 经常用于从此类文件中提取数据。
同上,针对其他
$ awk '{ print $3 }' <DPL # month started August April January January April April March $ awk '($1=="Ian") { print }' <DPL # DPL called Ian Ian Murdock August 1993 Ian Jackson January 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started April 1996
Bash 等 Shell 也可用于解析此类文件。
同上,针对其他
$ while read first last month year; do echo $month done <DPL ... same output as the first Awk example
在此,read
内置命令使用 “$IFS
”(内部字段分隔符)中的字符将行拆分为单词。
如果将 “$IFS
” 更改为 “:
”,则可以使用 shell 很好地解析 “/etc/passwd
”。
$ oldIFS="$IFS" # save old value $ IFS=':' $ while read user password uid gid rest_of_line; do if [ "$user" = "bozo" ]; then echo "$user's ID is $uid" fi done < /etc/passwd bozo's ID is 1000 $ IFS="$oldIFS" # restore old value
(如果使用 Awk 执行等效操作,请使用 “FS=':'
” 设置字段分隔符。)
IFS 也被 shell 用于拆分参数扩展、命令替换和算术扩展的结果。这些不会在双引号或单引号括起来的单词中发生。IFS 的默认值是 <空格>、<制表符> 和 <换行符> 的组合。
请注意使用此 shell IFS 技巧。当 shell 将脚本的某些部分解释为其 输入 时,可能会发生奇怪的事情。
$ IFS=":," # use ":" and "," as IFS $ echo IFS=$IFS, IFS="$IFS" # echo is a Bash builtin IFS= , IFS=:, $ date -R # just a command output Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # sub shell --> input to main shell Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # reset IFS to the default $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
以下脚本作为管道的一部分可以执行一些很好的操作。
表 1.26. 用于管道命令的脚本片段列表
脚本片段(在一行中键入) | 命令的效果 |
---|---|
find /usr -print
|
查找 “/usr ” 下的所有文件 |
seq 1 100
|
打印 1 到 100 |
| xargs -n 1 <command>
|
使用管道中的每个项目作为参数重复运行命令 |
| xargs -n 1 echo
|
将管道中以空格分隔的项目拆分为行 |
| xargs echo
|
将管道中的所有行合并为一行 |
| grep -e <regex_pattern>
|
从管道中提取包含 <regex_pattern> 的行 |
| grep -v -e <regex_pattern>
|
从管道中提取不包含 <regex_pattern> 的行 |
| cut -d: -f3 -
|
从管道中提取以 “: ” 分隔的第三个字段(passwd 文件等) |
| awk '{ print $3 }'
|
从管道中提取以空格分隔的第三个字段 |
| awk -F'\t' '{ print $3 }'
|
从管道中提取以制表符分隔的第三个字段 |
| col -bx
|
删除退格符并将制表符展开为空格 |
| expand -
|
展开制表符 |
| sort| uniq
|
排序并删除重复项 |
| tr 'A-Z' 'a-z'
|
将大写字母转换为小写字母 |
| tr -d '\n'
|
将行连接成一行 |
| tr -d '\r'
|
删除 CR |
| sed 's/^/# /'
|
在每行开头添加 “# ” |
| sed 's/\.ext//g'
|
删除 “.ext ” |
| sed -n -e 2p
|
打印第二行 |
| head -n 2 -
|
打印前 2 行 |
| tail -n 2 -
|
打印后 2 行 |
单行 shell 脚本可以使用 find(1) 和 xargs(1) 循环处理多个文件,以执行相当复杂的任务。请参阅第 10.1.5 节,“用于选择文件的习惯用法”和第 9.5.9 节,“重复命令循环处理文件”。
当使用 shell 交互模式变得过于复杂时,请考虑编写 shell 脚本(请参阅第 12.1 节,“Shell 脚本”)。