From fcbc6d639a31cd359cde30aa52ce1b04da8a8bd7 Mon Sep 17 00:00:00 2001 From: Arondight Date: Wed, 9 Mar 2016 20:48:45 +0800 Subject: [PATCH] =?UTF-8?q?#29=20=E7=BB=9F=E4=B8=80=E5=B1=95=E7=8E=B0?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dual_Booting_from_Hard_Drives.md | 1 + .../Dual_Booting_with_Partitions.md | 7 +- chapter_03/Dual_Booting/README.md | 1 + chapter_03/LILO.md | 11 ++- chapter_03/README.md | 1 + chapter_03/mkinitrd.md | 25 ++--- chapter_04/Archive_and_Compression/README.md | 1 + chapter_04/Archive_and_Compression/XZ_LZMA.md | 5 +- chapter_04/Archive_and_Compression/bzip2.md | 1 + chapter_04/Archive_and_Compression/gzip.md | 7 +- chapter_04/Archive_and_Compression/tar.md | 29 +++--- .../Archive_and_Compression/zip_and_unzip.md | 3 +- ...ile_and_Directory_Creation_and_Deletion.md | 13 +-- .../Listing_Files_and_Directory_Contents.md | 8 +- .../Moving_Around_the_Filesystem.md | 7 +- chapter_04/Linking.md | 5 +- chapter_04/README.md | 1 + chapter_04/Reading_Documents/README.md | 5 +- chapter_04/Reading_Documents/less.md | 9 +- chapter_04/Reading_Documents/more.md | 1 + chapter_04/System_Documentation.md | 29 +++--- chapter_05/Customization.md | 49 ++++++---- chapter_05/Environment_Variables.md | 45 +++++---- chapter_05/Input_and_Output_Redirection.md | 91 ++++++++++--------- chapter_05/Tab_Completion.md | 3 +- chapter_05/Task_Management.md | 17 ++-- chapter_05/Terminals.md | 5 +- chapter_05/What_Is_A_Shell.md | 1 + chapter_05/Wildcards.md | 35 ++++--- 29 files changed, 240 insertions(+), 176 deletions(-) diff --git a/chapter_03/Dual_Booting/Dual_Booting_from_Hard_Drives.md b/chapter_03/Dual_Booting/Dual_Booting_from_Hard_Drives.md index a6292f9..5c991c8 100644 --- a/chapter_03/Dual_Booting/Dual_Booting_from_Hard_Drives.md +++ b/chapter_03/Dual_Booting/Dual_Booting_from_Hard_Drives.md @@ -7,3 +7,4 @@ 如果您通过BIOS或EFI管理引导优先级,那么每个硬盘驱动器上的引导加载程序只会考虑自己所在设备而不考虑其他。这与引导装载程序的设计目的相反,但如果电脑上的闭源系统不顾用户喜好,坚持要成为唯一操作系统的话,这是个很有效的解决方案。 如果你没有很多硬盘设备并且又不喜欢折腾多分区的话,你也许会喜欢可启动的USB闪存盘,或是虚拟机。这两个方案已经超出了本书讨论范围(虽然是很常见的方案)。取决于你的需要,任君选择。 + diff --git a/chapter_03/Dual_Booting/Dual_Booting_with_Partitions.md b/chapter_03/Dual_Booting/Dual_Booting_with_Partitions.md index d49abf9..c712ed7 100644 --- a/chapter_03/Dual_Booting/Dual_Booting_with_Partitions.md +++ b/chapter_03/Dual_Booting/Dual_Booting_with_Partitions.md @@ -1,6 +1,6 @@ #### 引导多个分区 -在操作系统安装在各自分区的情况下,我们来配置多启动系统。您必须首先创建分区。如果在安装第一个操作系统之前就很好操作,在这种情况下,就是个简单的规划分区的事,使用`fdisk`或`cfdisk`分区工具,具体参见[“分区”部分](../../chapter_02/Partitioning.md)。 +在操作系统安装在各自分区的情况下,我们来配置多启动系统。您必须首先创建分区。如果在安装第一个操作系统之前就很好操作,在这种情况下,就是个简单的规划分区的事,使用`fdisk`或`cfdisk`分区工具,具体参见[第二章的“分区”部分](../../chapter_02/Partitioning.md)。

注意

如果你搭建的是两个Linux的双系统,我们不推荐两个系统共用/home. 虽然这在技术上可行,但因为不同的桌面环境和软件版本,会增加你的个人配置文件损坏几率。 @@ -16,9 +16,9 @@ * 交换分区 -首先,按照[第二章,安装](../../chapter_02/README.md)所述,把Slackware安装到第一个分区。 +首先,按照[“第二章、安装”](../../chapter_02/README.md)所述,把Slackware安装到第一个分区。 -安装好,启动好,一切正常之后,重启进入第二系统。第二系统总会想要占用整个驱动器,你显然*不希望*这样做,所以它限制为仅第二个分区。此外,该操作系统将尝试把引导器安装到硬盘驱动器的开头,覆盖LILO. +安装好,启动好,一切正常之后,重启进入第二系统。第二系统总会想要占用整个驱动器,你显然*不希望*这样做,所以它限制为仅第二个分区。此外,该操作系统将尝试把引导器安装到硬盘驱动器的开头,覆盖LILO. 有关引导器,可采取如下做法: @@ -45,3 +45,4 @@

使用简单模式LILO的时候,它也会自动探测并创建启动菜单。如果失败了,那么就需要手动创建条目了。

+ diff --git a/chapter_03/Dual_Booting/README.md b/chapter_03/Dual_Booting/README.md index d399f0d..fbe51b0 100644 --- a/chapter_03/Dual_Booting/README.md +++ b/chapter_03/Dual_Booting/README.md @@ -7,3 +7,4 @@ 多启动不应该掉以轻心,但它通常意味着你将有两个不同的试图管理引导程序的操作系统。如果你多启动,很可能一个操作系统会覆盖或更新引导程序条目。如果这种情况发生,你必须手动修改GRUB或LILO来引导这些操作系统。 有两种方法来双(多)启动:你可以把每个操作系统安装在不同的硬盘上(台式机常见,因为台式机有很多硬盘位)或安装在不同分区上(笔记本电脑常见,因为只有一个物理驱动器)。 + diff --git a/chapter_03/LILO.md b/chapter_03/LILO.md index 8936119..74a13cb 100644 --- a/chapter_03/LILO.md +++ b/chapter_03/LILO.md @@ -12,7 +12,7 @@ LILO是一种Linux引导器,并且目前是Slackware的默认引导器。如 `liloconfig`是能快速地配置好引导器,但如果你想知道究竟发生了什么的话,你需要看看LILO的配置文件:`/etc`下的`lilo.conf(5)`. `/etc/lilo.conf`分为了几个部分。最上面你能找到全局部分,这部分描述LILO应安装在何处(一般是MBR),启动时显示的图像或信息,启动默认操作系统的等待时长。以下是我的`lilo.conf`的全局部分,长这样: -```fundamental +``` # LILO configuration file boot = /dev/sda @@ -38,7 +38,7 @@ vga = 773 接下来看看操作系统部分。每个Linux操作系统的配置以"image"配置行开头。Microsoft Windows操作系统以"other"配置行开头。现在让我们来看看Slackware和Windows各自的配置样例。 -```fundamental +``` # LILO configuration file ... global section ommitted .... # Linux bootable partition config begins @@ -57,9 +57,9 @@ other = /dev/sda3 对于像Slackware这样的Linux操作系统,image配置项规定了要启动的内核。在这个例子中,要启动的内核是`/boot/vmlinuz-generic-2.6.29.4`. 其余的几个配置项看名字就可知道作用:它们告诉LILO根分区的位置,使用哪个`initrd`文件,把根文件系统挂载为只读。`initrd`配置项对于那些使用通用内核,或使用LVM和软件RAID的人十分重要。它告诉LILO(以及内核)在哪找到使用`mkinitrd`创建的`initrd`. -配置好`/etc/lilo.conf`后,运行`lilo(8)`来安装。不像GRUB和其他引导器那样,在更改配置文件之后需要重新运行lilo, 不然新修改的引导器镜像不会被安装,所做出的修改不会生效。 +配置好`/etc/lilo.conf`后,运行`lilo(8)`来安装。不像GRUB和其他引导器那样,在更改配置文件之后需要重新运行`lilo`, 不然新修改的引导器镜像不会被安装,所做出的修改不会生效。 -```Shell +``` darkstar:~# lilo Warning: LBA32 addressing assumed Added Slackware * @@ -67,4 +67,5 @@ Added Backup 6 warnings were issued. ``` -看见这些警告不必太惊慌,这些并不代表lilo出了问题,除非发现了致命错误。另外,LBA32 addressing 的警告是常有的事。 +看见这些警告不必太惊慌,这些并不代表`lilo`出了问题,除非发现了致命错误。另外,LBA32 addressing的警告是常有的事。 + diff --git a/chapter_03/README.md b/chapter_03/README.md index d864913..cd88026 100644 --- a/chapter_03/README.md +++ b/chapter_03/README.md @@ -1,3 +1,4 @@ ## 第三章、引导 既然你已经安装好了一个Slackware系统,你就应该学习些关于系统启动的知识,比如是什么控制着机器的启动顺序,当这一机制损坏的时候如何修复。如果你已使用Linux足够长的时间,你总有可能搞坏你的bootloader. 还好,修复它并不需要重装一次系统。Linux(更确切一点,Slackware)给予您启动过程的完全控制权,而不是像其他系统一样将底层工作原理隐藏起来。简单到只需修改几个配置文件并重新运行bootloader安装程序,你就能又快又好地修改(或破坏)你的系统。Slackware还让多系统启动更加简单,比如和其他Linux发行版或Microsoft Windows组成多系统。 + diff --git a/chapter_03/mkinitrd.md b/chapter_03/mkinitrd.md index 2071d27..9bf92b8 100644 --- a/chapter_03/mkinitrd.md +++ b/chapter_03/mkinitrd.md @@ -4,7 +4,7 @@ 查看一下你的`/boot`目录,就会发现安装在你系统上的各种各样的内核。 -```Shell +``` darkstar:~# ls -1 /boot/vmlinuz* /boot/vmlinuz-huge-2.6.29.4 /boot/vmlinuz-generic-2.6.29.4 @@ -14,13 +14,13 @@ darkstar:~# ls -1 /boot/vmlinuz* 巨型内核正如其名。但这**并不**意味着它们含有所有可用的驱动程序并把这些驱动编译进入内核。相反,这些内核是为了能够启动(并运行)在所有Slackware能支持的电脑上而设计的(虽然仍有一部分电脑无法正常启动/运行)。它们大多包含一些针对你机器上没有的硬件(以后也不会有)的支持,但这不是重点。出于各种原因我们附带上了这些内核,其中最重要的原因就是——它们是Slackware安装介质使用的内核。如果你选择让安装程序为您自动配置bootloader的话,它会使用这些内核来为数不尽的硬件提供支持。与之相反,通用内核不使用外部模块的话只能驱动很少一部分的硬件。如果你想使用通用内核的话,你就会用上initrd, 它是`mkinitrd(8)`工具生成的。 -那么,为什么要使用通用内核呢?目前出于各种原因,Slackware的开发团队建议使用通用内核。也许最显然的原因是文件大小。在未压缩并未加载到内存之前,巨型内核是通用内核的约两倍大小​​。如果您运行的是旧机器,或内存很小的机器,你会明白通用内核缩减大小的好处。其他原因就较为难以量化。巨型内核包含的驱动程序之间时不时就会发生冲突。一般来讲,​​巨型内核性能不如通用内核。此外,使用通用内核的话,就分别能给硬件驱动传递特殊的参数,而不需要在内核命令行上传递。如果你的内核使用的是外部模块形式的驱动程序,而不是静态地把他们构建进内核的时候,一些Slackware上的工具的性能会更高。如果你不是很懂,也不要惊慌:只要记得“巨型内核=好,通用内核=更好”。 +那么,为什么要使用通用内核呢?目前出于各种原因,Slackware的开发团队建议使用通用内核。也许最显然的原因是文件大小。在未压缩并未加载到内存之前,巨型内核是通用内核的约两倍大小​​。如果您运行的是旧机器,或内存很小的机器,你会明白通用内核缩减大小的好处。其他原因就较为难以量化。巨型内核包含的驱动程序之间时不时就会发生冲突。一般来讲,​​巨型内核性能不如通用内核。此外,使用通用内核的话,就分别能给硬件驱动传递特殊的参数,而不需要在内核命令行上传递。如果你的内核使用的是外部模块形式的驱动程序,而不是静态地把他们构建进内核的时候,一些Slackware上的工具的性能会更高。如果你不是很懂,也不要惊慌:只要记得“巨型内核意味着好,通用内核意味着更好”。 -不幸的是,使用通用内核不如使用巨型内核那么简单。为了使通用内核来引导你的系统,你还必须在`initrd`上加载几个基本模块。模块是编译好的内核代码段,可插入内核或从运行的内核去掉(最好使用`modprobe(8)`, 这使得系统只是增加了一点点的复杂性的基础上变得更加灵活。至少在这个部分,模块会让你联想到设备驱动程序。通常情况下,安装时不管你的根分区是什么文件系统都要加载对应的模块,如果你的根分区位于SCSI硬盘或者RAID控制器上也要加载模块。最后,如果你使用软件RAID, 硬盘加密,或LVM, 你还需要创建一个`initrd`, 无论你是否使用通用内核。 +不幸的是,使用通用内核不如使用巨型内核那么简单。为了使通用内核来引导你的系统,你还必须在initrd上加载几个基本模块。模块是编译好的内核代码段,可插入内核或从运行的内核去掉(最好使用`modprobe(8)`, 这使得系统只是增加了一点点的复杂性的基础上变得更加灵活。至少在这个部分,模块会让你联想到设备驱动程序。通常情况下,安装时不管你的根分区是什么文件系统都要加载对应的模块,如果你的根分区位于SCSI硬盘或者RAID控制器上也要加载模块。最后,如果你使用软件RAID, 硬盘加密,或LVM, 你还需要创建一个initrd, 无论你是否使用通用内核。 -`initrd`是一个`cpio(1)`文档,所以创建起来不是那么简单。还好,Slackware为你提供了一个使这一过程简单化的工具:`mkinitrd`. 真要详细讨论`mkinitrd`的话就超出了本书的讨论范围,在此只展示重点。更详细的解释请看手册页或使用`mkinitrd`的[--help]参数。 +initrd是一个`cpio(1)`文档,所以创建起来不是那么简单。还好,Slackware为你提供了一个使这一过程简单化的工具:`mkinitrd`. 真要详细讨论`mkinitrd`的话就超出了本书的讨论范围,在此只展示重点。更详细的解释请看手册页或使用`mkinitrd`的[--help]参数。 -```Shell +``` darkstar:~# mkinitrd --help mkinitrd creates an initial ramdisk (actually an initramfs cpio+gzip archive) used to load kernel modules that are needed to mount the @@ -32,7 +32,7 @@ initrd, and the script is easy to modify. Be creative. :-) 使用`mkinitrd`时,你需要掌握如下几个信息:你的根分区、根分区文件系统、你所使用的所有硬盘控制器、是否在使用LVM, 软件RAID, 硬盘加密。除非你在用某种SCSI控制器(并且根分区位于其上),你只需要知道根分区的文件系统和分区类型。现在假设你使用巨型内核启动进入了Slackware安装环境,此时只需使用`mount`命令查看`/proc/mount`的内容就能轻易地知道。 -```Shell +``` darkstar:~# mount /dev/sda1 on / type ext4 (rw,barrier=1,data=ordered) proc on /proc type proc (rw) @@ -42,9 +42,9 @@ usbfs on /proc/bus/usb type usbfs (rw) tmpfs on /dev/shm type tmpfs (rw) ``` -在上面的这个例子中,能知道你的根分区位于`/dev/sda1`并且是一个ext4分区类型。如果想为这个系统创建`initrd`, 只需将这些信息告知`mkinitrd`. +在上面的这个例子中,能知道你的根分区位于`/dev/sda1`并且是一个ext4分区类型。如果想为这个系统创建initrd, 只需将这些信息告知`mkinitrd`. -```Shell +``` darkstar:~# mkinitrd -f ext4 -r /dev/sda1 ``` @@ -52,8 +52,8 @@ darkstar:~# mkinitrd -f ext4 -r /dev/sda1 看看这些`mkinitrd`的选项就头疼,更别说记下它们了,尤其是你还想尝试各种不同内核的时候。Slackware开发团队也觉得很不爽,所以他们制作了一个简单的配置文件,`mkinitrd.conf(5)`. 你能在`/etc/mkinitrd.conf.sample`找到样板文件并自己定制。拿我自己的举例: -```Shell -darkstar:~# >/prompt>cat /etc/mkinitrd.conf.sample +``` +darkstar:~# cat /etc/mkinitrd.conf.sample # See "man mkinitrd.conf" for details on the syntax of this file # SOURCE_TREE="/boot/initrd-tree" @@ -71,12 +71,13 @@ LVM="1" #WAIT="1" ``` -若想详细了解这里每一行干了什么,请参见`mkinitrd.conf`的手册页面。将该样板复制为`/etc/mkinitrd.conf`并做出你自己的定制化修改。成功配置后,只需以[-F]参数运行`mkinitrd`, 这样就能得到正确的`initrd`文件而不用去记忆那些繁之又繁的参数。 +若想详细了解这里每一行干了什么,请参见`mkinitrd.conf`的手册页面。将该样板复制为`/etc/mkinitrd.conf`并做出你自己的定制化修改。成功配置后,只需以[-F]参数运行`mkinitrd`, 这样就能得到正确的initrd文件而不用去记忆那些繁之又繁的参数。 如果你不确定如何确定配置文件选项或命令行参数,以下是最终选择:Slackware提供了一个小工具(`/usr/share/mkinitrd/mkinitrd_command_generator.sh`),能告知你当前运行内核所需的选项值。运行这个脚本后就能输出对应你当前电脑的`mkinitrd`命令,不过你最好还是在运行前检查一遍。 -```Shell +``` darkstar:~# /usr/share/mkinitrd/mkinitrd_command_generator.sh mkinitrd -c -k 2.6.33.4 -f ext3 -r /dev/sda3 -m \ usbhid:ehci-hcd:uhci-hcd:ext3 -o /boot/initrd.gz ``` + diff --git a/chapter_04/Archive_and_Compression/README.md b/chapter_04/Archive_and_Compression/README.md index ebfddbe..9c38aae 100644 --- a/chapter_04/Archive_and_Compression/README.md +++ b/chapter_04/Archive_and_Compression/README.md @@ -1,3 +1,4 @@ ### 归档和压缩 每个人都会有把各种小文件打包以便存储,或压缩大文件的需要。也许你两个都需要?正好我们这里有能够达成目标的工具。 + diff --git a/chapter_04/Archive_and_Compression/XZ_LZMA.md b/chapter_04/Archive_and_Compression/XZ_LZMA.md index e12f32d..8feb5fd 100644 --- a/chapter_04/Archive_and_Compression/XZ_LZMA.md +++ b/chapter_04/Archive_and_Compression/XZ_LZMA.md @@ -1,7 +1,8 @@ #### XZ、LZMA -最新加入Slackware的压缩工具就是`xz`, 它使用的是LZMA压缩算法。它比`bzip2`更快并且压缩效果更好。实际上,它因为在速度和压缩效果上出色的综合表现,已经成为Slackware的首选压缩方案了。不过,`xz`在我们成书之时还没有手册页,所以要查看所有选项,使用[--help]参数。压缩使用[-z], 解压使用[-d]. +最新加入Slackware的压缩工具就是`xz`, 它使用的是LZMA压缩算法。它比`bzip2`更快并且压缩效果更好。实际上,它因为在速度和压缩效果上出色的综合表现,已经成为Slackware的首选压缩方案了。不过,`xz`在我们成书之时还没有手册页,所以要查看所有选项,使用`--help`参数。压缩使用`-z`, 解压使用`-d`. -```Shell +``` darkstar:~$ xz -z /tmp/large_file ``` + diff --git a/chapter_04/Archive_and_Compression/bzip2.md b/chapter_04/Archive_and_Compression/bzip2.md index d11b78e..c7f0563 100644 --- a/chapter_04/Archive_and_Compression/bzip2.md +++ b/chapter_04/Archive_and_Compression/bzip2.md @@ -1,3 +1,4 @@ #### bzip2 一个`gzip`的替代品就是`bzip2(1)`, 与`gzip`功能几乎相同。`bzip2`的优点就是号称能有更大压缩强度。不过,更大压缩强度意味着慢以及更多CPU占用,所以`bzip2`一般比其他压缩工具耗时更长。 + diff --git a/chapter_04/Archive_and_Compression/gzip.md b/chapter_04/Archive_and_Compression/gzip.md index 0788b63..a193844 100644 --- a/chapter_04/Archive_and_Compression/gzip.md +++ b/chapter_04/Archive_and_Compression/gzip.md @@ -2,13 +2,13 @@ Slackware所附带的最古老的压缩工具就是`gzip(1)`了。它一次只能处理一个文件。与`zip`能够压缩和打包不同,`gzip`只能压缩。你第一感觉这是个缺点,但实际上这是它的强大之处。UNIX的哲学之一就是让程序只做一件事并做到最好。这就让程序们能以无限多的组合方式来完成工作。要想压缩一个(或多个)文件,只需将它们作为参数传递给`gzip`. -```Shell +``` darkstar:~$ gzip /tmp/large_file ``` 解压就使用`gunzip`, 它会解压出文件并删除原来的压缩文件。 -```Shell +``` darkstar:~$ gunzip /tmp/large_file.gz darkstar:~$ ls /tmp/large_file* /tmp/large_file @@ -16,7 +16,7 @@ darkstar:~$ ls /tmp/large_file* 但如果我们不希望删除压缩文件,只想查看内容的话怎么办?`zcat`程序能读取`gzip`文件,解压到内存并将内容传输到标准输出(也就是终端屏幕,除非使用了重定向。重定向详见“[输入输出重定向](../../chapter_05/Input_and_Output_Redirection.md)”)。 -```Shell +``` darkstar:~$ zcat /tmp/large_file.gz Wed Aug 26 10:00:38 CDT 2009 Slackware 13.0 x86 is released as stable! Thanks to everyone who helped @@ -28,3 +28,4 @@ to help support the project. Once again, thanks to the entire Slackware community for all the help testing and fixing things and offering suggestions during this development cycle. ``` + diff --git a/chapter_04/Archive_and_Compression/tar.md b/chapter_04/Archive_and_Compression/tar.md index 740a53c..f2de6fc 100644 --- a/chapter_04/Archive_and_Compression/tar.md +++ b/chapter_04/Archive_and_Compression/tar.md @@ -4,28 +4,29 @@ 使用`tar`可以简单也可以复杂,随你喜好。一般,生成tarball要使用参数[-cvzf]. 我们来深入地看看: -|参数|意义| -|:----:|----:| -|c|创建tarball| -|x|解压tarball| -|t|显示tarball内容| -|v|输出更多信息| -|z|使用gzip压缩方案| -|j|使用bzip2压缩方案| -|J|使用LZMA压缩方案| -|p|保留权限信息| - -`tar`对于参数的顺序要求比别的程序更严格。[-f]参数当读或写入文件时必须出现,并且紧跟其后的必须是文件名。看看这个例子: +| 参数 | 意义 | +| :----: | ----: | +| c | 创建tarball | +| x | 解压tarball | +| t | 显示tarball内容 | +| v | 输出更多信息 | +| z | 使用gzip压缩方案 | +| j | 使用bzip2压缩方案 | +| J | 使用LZMA压缩方案 | +| p | 保留权限信息 | + +`tar`对于参数的顺序要求比别的程序更严格。`-f`参数当读或写入文件时必须出现,并且紧跟其后的必须是文件名。看看这个例子: -```Shell +``` darkstar:~$ tar -xvzf /tmp/tarball.tar.gz darkstar:~$ tar -xvfz /tmp/tarball.tar.gz ``` 上面,第一个命令能够正常运行,第二个会失败因为tar会尝试打开文件`z`而不是`/tmp/tarball.tar.gz`. -既然我们已经充分了解了参数的意义,来让我们看看如何创建和解压tarball. 前面已经说过,[-c]参数用来创建而[-x]用来解压。如果想创建或解压一个压缩过的tarball, 我们需要指定合适的压缩方案。自然,如果不想压缩文件也可以不填。下面的这个命令使用gzip算法创建并压缩一个tarball. 尽管没有严格要求,但还是加上`.tar`的扩展名以及所使用的压缩算法为最好。 +既然我们已经充分了解了参数的意义,来让我们看看如何创建和解压tarball. 前面已经说过,`-c`参数用来创建而`-x`用来解压。如果想创建或解压一个压缩过的tarball, 我们需要指定合适的压缩方案。自然,如果不想压缩文件也可以不填。下面的这个命令使用gzip算法创建并压缩一个tarball. 尽管没有严格要求,但还是加上`.tar`的扩展名以及所使用的压缩算法为最好。 ```Shell darkstar:~$ tar -czf /tmp/tarball.tar.gz /tmp/tarball/ ``` + diff --git a/chapter_04/Archive_and_Compression/zip_and_unzip.md b/chapter_04/Archive_and_Compression/zip_and_unzip.md index ac20685..5e88337 100644 --- a/chapter_04/Archive_and_Compression/zip_and_unzip.md +++ b/chapter_04/Archive_and_Compression/zip_and_unzip.md @@ -2,7 +2,7 @@ 你应该对`.zip`文件非常熟悉了。这是含有其他文件或目录的压缩文件。虽然在Linux世界中我们通常不使用zip文件,但它们在其他系统里广为使用,所有我们时不时会有处理它的需要。 -要创建一个zip文件,你需要(废话)使用`zip(1)`命令。你能用`zip`压缩文件、目录、或文件和目录。你需要使用[-r]参数来递归处理目录。 +要创建一个zip文件,你需要(废话)使用`zip(1)`命令。你能用`zip`压缩文件、目录、或文件和目录。你需要使用`-r`参数来递归处理目录。 ```Shell darkstar:~$ zip -r /tmp/home.zip /home @@ -16,3 +16,4 @@ darkstar:~$ zip /tmp/large_file.zip /tmp/large_file ```Shell darkstar:~$ unzip /tmp/home.zip ``` + diff --git a/chapter_04/Dealing_with_Files_and_Directories/File_and_Directory_Creation_and_Deletion.md b/chapter_04/Dealing_with_Files_and_Directories/File_and_Directory_Creation_and_Deletion.md index d5d3ea2..7ccbd80 100644 --- a/chapter_04/Dealing_with_Files_and_Directories/File_and_Directory_Creation_and_Deletion.md +++ b/chapter_04/Dealing_with_Files_and_Directories/File_and_Directory_Creation_and_Deletion.md @@ -4,7 +4,7 @@ `touch`实际上只是修改文件的时间戳,如果文件不存在的话就会创建一个。 -```Shell +``` darkstar:~/foo$ ls -l -rw-r--r-- 1 alan users 0 2012-01-18 15:01 bar1 darkstar:~/foo$ touch bar2 @@ -17,22 +17,22 @@ darkstar:~/foo$ touch bar1 注意`bar2`是如何被第二条命令创建出来的,以及第三条命令只是修改了`bar1`的时间戳。 -`mkdir`用于(这名字很显然)创建目录。`mkdir foo`能在当前文件夹创建一个叫"foo"的目录。此外,你可使用[-p]参数创建传入命令中任一缺失的父级目录。 +`mkdir`用于(这名字很显然)创建目录。`mkdir foo`能在当前文件夹创建一个叫"foo"的目录。此外,你可使用`-p`参数创建传入命令中任一缺失的父级目录。 -```Shell +``` darkstar:~$ mkdir foo darkstar:~$ mkdir /slack/foo/bar/ mkdir: cannot create directory `/slack/foo/bar/': No such file or directory darkstar:~$ mkdir -p /slack/foo/bar/ ``` -在上面的例子中,我们创建了"/slack", 然后是"/slack/foo", 最后是"/slack/foo/bar". 如果没使用[-p]参数的话,那么就不能创建"/slack/foo/bar", 除非前两级目录存在。 +在上面的例子中,我们创建了`/slack`, 然后是`/slack/foo`, 最后是`/slack/foo/bar`. 如果没使用`-p`参数的话,那么就不能创建`/slack/foo/bar`, 除非前两级目录存在。 -删除和创建一样简单。`rm(1)`命令能删除一个文件(假设你有足够的权限)。有一些常用的参数。第一个就是[-f]参数,用来强行删除文件(但也可能因为缺少权限失败)。[-r]参数用来删除目录及其中的内容。 +删除和创建一样简单。`rm(1)`命令能删除一个文件(假设你有足够的权限)。有一些常用的参数。第一个就是`-f`参数,用来强行删除文件(但也可能因为缺少权限失败)。`-r`参数用来删除目录及其中的内容。 还有另一个命令用来删除目录,就是毫无存在感的`rmdir(1)`. `rmdir`只能删除空目录,如果其中含有文件或子目录的话会报错。 -```Shell +``` darkstar:~$ ls foo_1/ foo_2/ darkstar:~$ ls foo_1 @@ -46,3 +46,4 @@ bar_2/ darkstar:~$ rm -fr foo_2 darkstar:~$ ls ``` + diff --git a/chapter_04/Dealing_with_Files_and_Directories/Listing_Files_and_Directory_Contents.md b/chapter_04/Dealing_with_Files_and_Directories/Listing_Files_and_Directory_Contents.md index 1ff8413..22a535c 100644 --- a/chapter_04/Dealing_with_Files_and_Directories/Listing_Files_and_Directory_Contents.md +++ b/chapter_04/Dealing_with_Files_and_Directories/Listing_Files_and_Directory_Contents.md @@ -2,7 +2,7 @@ `ls(1)`用于列出文件和目录,及其权限、大小、类型、inode、所有者和组,还有很多其他信息。比如,列出Slackware的`/`目录: -```Shell +``` darkstar:~$ ls / bin/ dev/ home/ lost+found/ mnt/ proc/ sbin/ sys/ usr/ boot/ etc/ lib/ media/ opt/ root/ srv/ tmp/ var/ @@ -10,7 +10,7 @@ boot/ etc/ lib/ media/ opt/ root/ srv/ tmp/ var/ 注意,上面所有列出项都是目录。通过后面附带的`/`我们能够很容易地把它们和文件区分开(标准文件没有这个后缀)。此外,可执行文件会有一个星号的后缀。`ls`还能做到更多。要列出文件和目录的权限,你需要“长列表(long list)”: -```Shell +``` darkstar:~$ ls -l /home/alan/Desktop -rw-r--r-- 1 alan users 15624161 2007-09-21 13:02 9780596510480.pdf -rw-r--r-- 1 alan users 3829534 2007-09-14 12:56 imgscan.zip @@ -21,9 +21,9 @@ drwxr-xr-x 2 alan users 136 2007-09-30 03:16 playground/ 长列表能列出权限、用户和组所有权、文件大小、上次修改时间,以及文件名。注意,上面前两个列出项是文件,后三个是目录。这可以通过每行的第一个字母辨别出来。正常文件是一个`-`, 目录是一个`d`. 其他文件类型有各自的符号,比如符号链接是`l`. -最后,我要展示如何列出带点的文件,也就是隐藏文件。不像其他操作系统(比如Microsoft Windows)那样,没有专门用来标识“隐藏”和“非隐藏”的文件性质。隐藏文件名开头是一个点。要想把隐藏文件也显示出来,给`ls`传递[-a]参数。 +最后,我要展示如何列出带点的文件,也就是隐藏文件。不像其他操作系统(比如Microsoft Windows)那样,没有专门用来标识“隐藏”和“非隐藏”的文件性质。隐藏文件名开头是一个点。要想把隐藏文件也显示出来,给`ls`传递`-a`参数。 -```Shell +``` darkstar:~$ ls -a .xine/ .xinitrc-backup .xscreensaver .xsession-errors SBo/ .xinitrc .xinitrc-xfce .xsession .xwmconfig/ Shared/ diff --git a/chapter_04/Dealing_with_Files_and_Directories/Moving_Around_the_Filesystem.md b/chapter_04/Dealing_with_Files_and_Directories/Moving_Around_the_Filesystem.md index ae8b5ac..32789a8 100644 --- a/chapter_04/Dealing_with_Files_and_Directories/Moving_Around_the_Filesystem.md +++ b/chapter_04/Dealing_with_Files_and_Directories/Moving_Around_the_Filesystem.md @@ -1,8 +1,8 @@ #### 在文件系统中移动 -`cd`是用来改变当前目录的命令。不像其他命令那样,`cd`实际上不是独立程序而是shell的内置命令。基本上,那也就意味着cd没有自己的手册页。你得查看你shell的文档来查看`cd`的详细情况。大部分情况下,它们是一样的。 +`cd`是用来改变当前目录的命令。不像其他命令那样,`cd`实际上不是独立程序而是shell的内置命令。基本上,那也就意味着`cd`没有自己的手册页。你得查看你shell的文档来查看`cd`的详细情况。大部分情况下,它们是一样的。 -```Shell +``` darkstar:~$ cd / darkstar:/$ls bin/ dev/ home/ lost+found/ mnt/ proc/ sbin/ sys/ usr/ @@ -13,7 +13,8 @@ darkstar:/usr/local$ 注意到改变目录时提示符的变化了吗?默认情况下Slackware shell将其用作一个查看当前目录的快速,简单的方式,但这实际上不是`cd`的功能。如果你的shell不像这样显示,你也能用`pwd(1)`轻易地获取你当前工作目录。(大多数UNIX shell能配置出这个显示目录的功能。实际上,这是另一个Slackware做出的小改进。) -```Shell +``` darkstar:~$ pwd /usr/local ``` + diff --git a/chapter_04/Linking.md b/chapter_04/Linking.md index 4aa13ca..c43643e 100644 --- a/chapter_04/Linking.md +++ b/chapter_04/Linking.md @@ -2,7 +2,7 @@ 链接是使用不同名字引用相同文件的方式。使用`ln(1)`程序,用户就能使用不同名字引用相同文件。这两个文件不是把一个复制了一遍,也不是完全相同的两个独立文件,仅仅是不同名字而已。(这就像`rm`或其他工具删除的原理一样,并非抹除了文件内容,只是解除了文件的引用并释放空间以供再次使用。`ln`与之相反,只是创建到文件的第二个引用)要想完整删除一个文件,所有的名字必须删除。 -```Shell +``` darkstar:~$ ln /etc/slackware-version foo darkstar:~$ cat foo Slackware 14.0 @@ -13,7 +13,7 @@ darkstar:~$ ls -l /etc/slackware-version foo 还有另一种类型的链接:符号链接。符号链接不是到文件的引用,而是一种有自己独立权限的特殊文件。符号链接会指向另外的文件或目录。符号链接的优点就是能像文件一样引用目录,并且可跨文件系统。可用[-s]参数来创建符号链接。 -```Shell +``` darkstar:~$ ln -s /etc/slackware-version foo darkstar:~$ cat foo Slackware 140 @@ -23,3 +23,4 @@ lrwxrwxrwx 1 root root 22 2008-01-25 04:16 foo -> /etc/slackware-version ``` 使用符号链接时,注意如果源文件被删掉了,符号链接就会失效:此时它指向一个不存在的文件。 + diff --git a/chapter_04/README.md b/chapter_04/README.md index dbd5c1e..62d40c0 100644 --- a/chapter_04/README.md +++ b/chapter_04/README.md @@ -1,3 +1,4 @@ ## 基本Shell命令 既然你已经安装了Slackware并且打开了终端提示符,接下来呢?接下来是个学习基本命令行工具的好时机。既然你是个完全的新手,你也许需要一些帮助来适应。这就是本章的内容。 + diff --git a/chapter_04/Reading_Documents/README.md b/chapter_04/Reading_Documents/README.md index 0def348..a1b2185 100644 --- a/chapter_04/Reading_Documents/README.md +++ b/chapter_04/Reading_Documents/README.md @@ -4,9 +4,10 @@ 早期,如果你想查看文件内容(任何文件,包括文本文件和二进制程序)你需要用到`cat(1)`. `cat`是个很简单的程序,能接受一个或多个文件,将其连接(连接,con**cat**enate, 因此得名)起来并输出到标准输出(一般是你的终端屏幕)。当文件不大不会刷屏时还好,但不适合阅览大型文件因为它没有内置的文件内跳转的功能,也不能逐段读取。今天,`cat`依然被广泛使用,但主要用在脚本里来合成文件。 -```Shell +``` darkstar:~$ cat /etc/slackware-version Slackware 14.0 ``` -看到cat的缺点,一些聪明人士坐下来开发一个能一次只读取一页的程序。这种程序被称为"pagers". 最早的就是`more(1)`, 因为你能随时看到更多(more)文件内容而得名。 +看到`cat`的缺点,一些聪明人士坐下来开发一个能一次只读取一页的程序。这种程序被称为"pagers". 最早的就是`more(1)`, 因为你能随时看到更多(more)文件内容而得名。 + diff --git a/chapter_04/Reading_Documents/less.md b/chapter_04/Reading_Documents/less.md index e0fcce2..3321997 100644 --- a/chapter_04/Reading_Documents/less.md +++ b/chapter_04/Reading_Documents/less.md @@ -1,6 +1,6 @@ #### less -为了克服`more`的缺点,一个新的pager诞生了,针锋相对地起名为`less(1)`. `less`是一个非常强大的pager,除了支持more的所有功能以外还有一些其他特性。比如,`less`允许使用方向键来控制。 +为了克服`more`的缺点,一个新的pager诞生了,针锋相对地起名为`less(1)`. `less`是一个非常强大的pager,除了支持`more`的所有功能以外还有一些其他特性。比如,`less`允许使用方向键来控制。 因为它相当受欢迎,许多Linux发行版将`more`排除在外来支持`less`. Slackware两个都有。另外,Slackware有一个`less`的预处理器`lesspipe.sh`. 它能让用户在一些非文本文件上执行`less`. `lesspipe.h`在传入文件后会生成文本输出,并在`less`内显示。 @@ -10,12 +10,13 @@ 与`more`一样,也能通过管道打开文件: -```Shell -darkstar:~$ less +``` +darkstar:~$ less /usr/doc/less-*/README -darkstar:~$ cat +darkstar:~$ cat /usr/doc/less*/README /usr/doc/util-linux*/README | less ``` `less`还有更多功能等待发现,只需输入**h**. + diff --git a/chapter_04/Reading_Documents/more.md b/chapter_04/Reading_Documents/more.md index c22c8cb..0faf25a 100644 --- a/chapter_04/Reading_Documents/more.md +++ b/chapter_04/Reading_Documents/more.md @@ -7,3 +7,4 @@

注意

实际上,现代版本的more, 比如Slackware附带的,确实有一个返回功能(输入b键),但只支持more直接打开文件的方式,more通过管道打开的文件是不支持的。

+ diff --git a/chapter_04/System_Documentation.md b/chapter_04/System_Documentation.md index 0332262..b036d3a 100644 --- a/chapter_04/System_Documentation.md +++ b/chapter_04/System_Documentation.md @@ -4,9 +4,9 @@ 不过,你不可能总是知道哪个任务该用什么程序来完成。还好,man内置搜索功能。使用[-k]参数就能让`man`在所有手册页中搜索给定的关键词。 -手册页根据内容的类型被分为几组(group)或部分(section)。比如,section 1是用户程序部分。man会按顺序搜索每个section并输出第一个匹配项。有时你会发现某个条目的手册页出现在不止一个section里。这时,你就要指定搜索的范围。本书中,所有的程序和部分内容会在它右边附带一个括起来的数字,这个数字就是你要给`man`指定的搜索范围。 +手册页根据内容的类型被分为几组(group)或部分(section)。比如,“section 1”是用户程序部分。`man`会按顺序搜索每个section并输出第一个匹配项。有时你会发现某个条目的手册页出现在不止一个section里。这时,你就要指定搜索的范围。本书中,所有的程序和部分内容会在它右边附带一个括起来的数字,这个数字就是你要给`man`指定的搜索范围。 -```Shell +``` darkstar:~$ man -k printf printf (1) - format and print data printf (3) - formatted output conversion @@ -15,15 +15,16 @@ darkstar:~$ man 3 printf 手册页section列表 -|Section|内容| -|:-------:|----:| -|1|用户命令| -|2|系统调用| -|3|C语言库调用| -|4|设备| -|5|文件格式/协议| -|6|游戏| -|7|约定/宏包| -|8|系统管理工具| -|9|内核API描述| -|n|"New"——通常用于Tcl/Tk| +| Section | 内容 | +| :-------: |----: | +| 1 | 用户命令 | +| 2 | 系统调用 | +| 3 | C语言库调用 | +| 4 | 设备 | +| 5 | 文件格式/协议 | +| 6 | 游戏 | +| 7 | 约定/宏包 | +| 8 | 系统管理工具 | +| 9 | 内核API描述 | +| n | "New"——通常用于Tcl/Tk | + diff --git a/chapter_05/Customization.md b/chapter_05/Customization.md index 683612f..ca25f0e 100644 --- a/chapter_05/Customization.md +++ b/chapter_05/Customization.md @@ -2,34 +2,45 @@ 现在你应该对bash有所属性,并且你可能会碰到一些奇特的情况。比如说,当你登录的时候,会呈现给你一个类似下面这样的提示。 - alan@darkstar:~$ +``` +alan@darkstar:~$ +``` 但是,有些时候你可能会看到像下面这样的提示: - bash-3.1$ +``` +bash-3.1$ +``` -造成这样的原因和控制bash提示的环境变量有关。一些shell被认为是"login"shell,而另一些shell则被认为是"interactive"shell,这两种shell当它们启动的时候读取的是不一样的配置文件。"login"shell读取的是*/etc/profile*和*~/.bash_profile*。"interactive"shell读取的是*~/.bashrc*。这对于一些有能力的用户来说是有好处的,但是对于新手来说它们并不关心这两种shell的不同,并且希望任何时候它们执行bash的时候都能有相同的环境。如果是这样,编辑你的*~/.bashrc*文件,然后写入一下几行。(更多关于配置文件的详情请阅读bash手册的INVOCATION一节) +造成这样的原因和控制bash提示的环境变量有关。一些shell被认为是“login”shell,而另一些shell则被认为是“interactive”shell,这两种shell当它们启动的时候读取的是不一样的配置文件。“login”shell读取的是`/etc/profile`和`~/.bash_profile`。“interactive”shell读取的是`~/.bashrc`。这对于一些有能力的用户来说是有好处的,但是对于新手来说它们并不关心这两种shell的不同,并且希望任何时候它们执行bash的时候都能有相同的环境。如果是这样,编辑你的`~/.bashrc`文件,然后写入以下几行。(更多关于配置文件的详情请阅读bash手册的“INVOCATION”一节) - # ~/.bashrc - . /etc/profile - . ~/.bash_profile +``` +# ~/.bashrc +. /etc/profile +. ~/.bash_profile +``` -当输入上述内容后,"login"和"interactive"shell都会有同样的环境设置。现在如果我们想自己定制shell设定,只要编辑*~/.bash_profile*(用户各自的)或者*/etc/profile*(全局的)。让我们开始配置bash提示。 +当输入上述内容后,“login”和“interactive”shell都会有同样的环境设置。现在如果我们想自己定制shell设定,只要编辑`~/.bash_profile`(用户各自的)或者`/etc/profile`(全局的)。让我们开始配置bash提示。 -对于bash提示的格式每个用户都有各自的喜好。我个人倾向于短小的简单的提示,因为那样节省空间。但我也使用多多行提示。我其中的一个朋友甚至在它的提示中包含ASCII-art。要改变你的提示格式,你只需要改变PS1变量。默认情况下,Slackware将提示配置成如下格式: +对于bash提示的格式每个用户都有各自的喜好。我个人倾向于短小的简单的提示,因为那样节省空间。但我也使用多多行提示。我其中的一个朋友甚至在它的提示中包含ASCII-art。要改变你的提示格式,你只需要改变**PS1**变量。默认情况下,Slackware将提示配置成如下格式: - darkstar:~$ echo $PS1 - \u@\h:\w\$ +``` +darkstar:~$ echo $PS1 +\u@\h:\w\$ +``` -是的,这个看上去有点搞笑的一串东西控制着你bash的提示格式。基本上,每一个在*PS1*变量中的字符都包含在了提示中,除非之前有转义字符'\'。有很多的转义序列,我们不会一个个去讨论,但是我会解释这里的这些。第一个"\u"会被转义成当前用户的用户名。"\h"是主机名。"\w"是当前的工作目录,'\$'显示的要么是'#'(root用户)要么是'$'(普通用户)。一个完整的转义序列列表可以在bash手册的PROMOTING一节中看到。 +是的,这个看上去有点搞笑的一串东西控制着你bash的提示格式。基本上,每一个在**PS1**变量中的字符都包含在了提示中,除非之前有转义字符`\\`。有很多的转义序列,我们不会一个个去讨论,但是我会解释这里的这些。第一个`\u`会被转义成当前用户的用户名。`\h`是主机名。`\w`是当前的工作目录,`\$`显示的要么是“#”(root用户)要么是“$”(普通用户)。一个完整的转义序列列表可以在bash手册的“PROMOTING”一节中看到。 -虽然我们已经讨论了这个默认的提示,不过我还要花些时间展示给你几个提示的例子以及*PS1*的设置。 +虽然我们已经讨论了这个默认的提示,不过我还要花些时间展示给你几个提示的例子以及**PS1**的设置。 - Wed Jan 14 12:08 AM - alan@raven:~$ echo $PS1 - \d \@\n\u@\h:\w$ - HOST: raven - JOBS: 0 - TTY: 3 - alan@~/Desktop/sb_3.0:$ echo $PS1 - HOST: \H - JOBS: \j - TTY: \l\n\u@\w:\$ +``` +Wed Jan 14 12:08 AM +alan@raven:~$ echo $PS1 +\d \@\n\u@\h:\w$ +HOST: raven - JOBS: 0 - TTY: 3 +alan@~/Desktop/sb_3.0:$ echo $PS1 +HOST: \H - JOBS: \j - TTY: \l\n\u@\w:\$ +``` + +更多配置bash提示的信息,包括设置有颜色的提示,可以参考`/usr/doc/Linux-HOWTOs/Bash-Prompt-HOWTO`。这个文档会带给你一个好的想法。 -更多配置bash提示的信息,包括设置有颜色的提示,可以参考'/usr/doc/Linux-HOWTOs/Bash-Prompt-HOWTO'。在读了那个文档之后,你会有一个好的想法 diff --git a/chapter_05/Environment_Variables.md b/chapter_05/Environment_Variables.md index c652f3e..69f5054 100644 --- a/chapter_05/Environment_Variables.md +++ b/chapter_05/Environment_Variables.md @@ -1,29 +1,38 @@ ### 环境变量 -通过设置环境变量能使一些任务做起来更加容易。环境变量是一些用户希望存储或者以后会用到的信息的间断的名称。举个例子来说,环境变量*PS1*告诉bash如何显示提示符的格式。其他变量可能告诉应用程序如何运行。举个例子,*LESSOPEN*变量告诉`less`运行简便的*lesspipe.sh*预处理器,*LS_OPTIONS*为`ls`开启颜色显示。 +通过设置环境变量能使一些任务做起来更加容易。环境变量是一些用户希望存储或者以后会用到的信息的间断的名称。举个例子来说,环境变量**PS1**告诉bash如何显示提示符的格式。其他变量可能告诉应用程序如何运行。举个例子,**LESSOPEN**变量告诉`less`运行简便的*lesspipe.sh*预处理器,**LS_OPTIONS**为`ls`开启颜色显示。 设置你自己的环境变量是容易的。bash包含两个内建的函数用来设置变量:`set`和`export`。除此以外,环境变量也可以被`unset`移除。(如果你不小心用`unset`移除了一个你不知道干什么的环境变量,不要紧张。你可以通过登出终端后再重新登录的方式重置所有默认的变量)。你可以通过在变量名前加($)符号来获取变量的值。 - darkstar:~$ set FOO=bar - darkstar:~$ echo $FOO - bar +``` +darkstar:~$ set FOO=bar +darkstar:~$ echo $FOO +bar +``` -`set`和`export`最主要的区别是`export`会将变量应用到子shell中(子shell就是运行在一个父shell中的另一个shell)。你可以通过控制提示符显示的*PS1*变量来查看这一区别。 +`set`和`export`最主要的区别是`export`会将变量应用到子shell中(子shell就是运行在一个父shell中的另一个shell)。你可以通过控制提示符显示的**PS1**变量来查看这一区别。 - darkstar:~$ set PS1='FOO ' - darkstar:~$ export PS1='FOO ' - FOO +``` +darkstar:~$ set PS1='FOO ' +darkstar:~$ export PS1='FOO ' +FOO +``` -还有其他重要的环境变量,不过其中最重要的一个环境变量是*PATH*。*PATH*一个用来搜索应用程序的目录列表。例如,`top`位于`/usr/bin/top`。你可以输入完整路径来运行这个程序,但是如果`/usr/bin`位于*PATH*变量中,则直接输入`top`就可以运行,bash会搜索到这里你无需手动输入完整路径。当你作为普通用户来尝试运行一个程序是,你首先需要看看它所在的目录在不再*PATH*变量中,例如`ifconfig`。 +还有其他重要的环境变量,不过其中最重要的一个环境变量是**PATH**。**PATH**一个用来搜索应用程序的目录列表。例如,`top`位于`/usr/bin/top`。你可以输入完整路径来运行这个程序,但是如果`/usr/bin`位于**PATH**变量中,则直接输入`top`就可以运行,bash会搜索到这里你无需手动输入完整路径。当你作为普通用户来尝试运行一个程序是,你首先需要看看它所在的目录在不在**PATH**变量中,例如`ifconfig`。 - darkstar:~$ ifconfig - bash: ifconfig: command not found - darkstar:~$ echo $PATH - /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/opt/www/htdig/bin:. +``` +darkstar:~$ ifconfig +bash: ifconfig: command not found +darkstar:~$ echo $PATH +/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/opt/www/htdig/bin:. +``` -上面是一个典型的普通用户的*PATH*。你可以像改变其他环境变量一样改变它。如果你以root身份登录,你会看到不一样的*PATH*。 +上面是一个典型的普通用户的**PATH**。你可以像改变其他环境变量一样改变它。如果你以root身份登录,你会看到不一样的**PATH**。 + +``` +darkstar:~$ su - +Password: +darkstar:~# echo $PATH +/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/opt/www/htdig/bin +``` - darkstar:~$ su - - Password: - darkstar:~# echo $PATH - /usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/opt/www/htdig/bin diff --git a/chapter_05/Input_and_Output_Redirection.md b/chapter_05/Input_and_Output_Redirection.md index e2a813d..9f03541 100644 --- a/chapter_05/Input_and_Output_Redirection.md +++ b/chapter_05/Input_and_Output_Redirection.md @@ -2,46 +2,55 @@ Linux和其他类UNIX操作系统的一个特点就是小和相对简单的应用程序的数量,以及能够将将它们堆叠在一起来创造复杂程序的能力。这可以通过重定向一个程序的输出到另一个程序,或者通过从一个文件或者第二个程序中提取输入来做到。 -一开始,我们会演示给你如何将一个程序的输出重定向到文件中。这通过'>'字符来实现。当bash看到'>'字符时,会将标准输出(stdout)的内容重定向到字符后面跟着的文件中。 - - darkstar:~$ echo foo - foo - darkstar:~$ echo foo > /tmp/bar - darkstar:~$ cat /tmp/bar - foo - -在这个例子中,我们演示了如果没有将标准输出定位到一个文件中,`echo`会显示的内容,之后我们将其重定向到*/tmp/bar*文件中。如果这个文件不存在,会被创建。然后`echo`输出的内容就会被放在其中。如果这个文件存在,则其中的内容会被覆盖。如果你想保存这个文件中原本的内容,可以使用'>>'来添加输出到文件的后面。 - - darkstar:~$ echo foo - foo - darkstar:~$ echo foo > /tmp/bar - darkstar:~$ cat /tmp/bar - foo - darkstar:~$ echo foo2 >> /tmp/bar - darkstar:~$ cat /tmp/bar - foo - foo2 - -你也可以重定向标准错误(stderr)到文件中。这有一点不同,你需要使用'2>'而不是'>'(因为bash能重定向标准输入,标准输出和标准错误,因此需要进行区分。0表示标准输入,1表示标准输出,2表示标准错误。除非你指明,否则bash会认为'>'表示的是重定向到标准输出。'1>'表示的也是重定向到标准输出)。 - - darkstar:~$ rm bar - rm: cannot remove 'bar': No such file or directory - darkstar:~$ rm bar 2> /tmp/foo - darkstar:~$ cat /tmp/foo - rm: cannot remove 'bar': No such file or directory - -如果你要重定向标准输入,使用'<'字符,尽管这并不常用。 - -darkstar:~$ fromdos < dosfile - -最后你也可以将一个程序的输出重定向到另一个程序的输入。这也许是bash和其他shell最有用的特点,可以通过'|'字符完成。(这个字符被认为是管道符,就好像连接两个程序的管道) - - darkstar:~$ ps auxw | grep getty - root 2632 0.0 0.0 1656 532 tty2 Ss+ Feb21 0:00 /sbin/agetty 38400 tty2 linux - root 3199 0.0 0.0 1656 528 tty3 Ss+ Feb15 0:00 /sbin/agetty 38400 tty3 linux - root 3200 0.0 0.0 1656 532 tty4 Ss+ Feb15 0:00 /sbin/agetty 38400 tty4 linux - root 3201 0.0 0.0 1656 532 tty5 Ss+ Feb15 0:00 /sbin/agetty 38400 tty5 linux - root 3202 0.0 0.0 1660 536 tty6 Ss+ Feb15 0:00 /sbin/agetty 38400 tty6 linux - +一开始,我们会演示给你如何将一个程序的输出重定向到文件中。这通过`>`字符来实现。当bash看到`>`字符时,会将标准输出(stdout)的内容重定向到字符后面跟着的文件中。 + +``` +darkstar:~$ echo foo +foo +darkstar:~$ echo foo > /tmp/bar +darkstar:~$ cat /tmp/bar +foo +``` + +在这个例子中,我们演示了如果没有将标准输出定位到一个文件中,`echo`会显示的内容,之后我们将其重定向到`/tmp/bar`文件中。如果这个文件不存在,会被创建。然后`echo`输出的内容就会被放在其中。如果这个文件存在,则其中的内容会被覆盖。如果你想保存这个文件中原本的内容,可以使用`>>`来添加输出到文件的后面。 + +``` +darkstar:~$ echo foo +foo +darkstar:~$ echo foo > /tmp/bar +darkstar:~$ cat /tmp/bar +foo +darkstar:~$ echo foo2 >> /tmp/bar +darkstar:~$ cat /tmp/bar +foo +foo2 +``` + +你也可以重定向标准错误(stderr)到文件中。这有一点不同,你需要使用`2>`而不是`>`(因为bash能重定向标准输入,标准输出和标准错误,因此需要进行区分。`0`表示标准输入,`1`表示标准输出,`2`表示标准错误。除非你指明,否则bash会认为`>`表示的是重定向到标准输出。`1>`表示的也是重定向到标准输出)。 + +``` +darkstar:~$ rm bar +rm: cannot remove 'bar': No such file or directory +darkstar:~$ rm bar 2> /tmp/foo +darkstar:~$ cat /tmp/foo +rm: cannot remove 'bar': No such file or directory +``` + +如果你要重定向标准输入,使用`<`字符,尽管这并不常用。 + +``` +darkstar:~$ fromdos < dosfile +``` + +最后你也可以将一个程序的输出重定向到另一个程序的输入。这也许是bash和其他shell最有用的特点,可以通过`|`字符完成。(这个字符被认为是管道符,就好像连接两个程序的管道) + +``` +darkstar:~$ ps auxw | grep getty +root 2632 0.0 0.0 1656 532 tty2 Ss+ Feb21 0:00 /sbin/agetty 38400 tty2 linux +root 3199 0.0 0.0 1656 528 tty3 Ss+ Feb15 0:00 /sbin/agetty 38400 tty3 linux +root 3200 0.0 0.0 1656 532 tty4 Ss+ Feb15 0:00 /sbin/agetty 38400 tty4 linux +root 3201 0.0 0.0 1656 532 tty5 Ss+ Feb15 0:00 /sbin/agetty 38400 tty5 linux +root 3202 0.0 0.0 1660 536 tty6 Ss+ Feb15 0:00 /sbin/agetty 38400 tty6 linux +``` diff --git a/chapter_05/Tab_Completion.md b/chapter_05/Tab_Completion.md index df0be00..00d64f9 100644 --- a/chapter_05/Tab_Completion.md +++ b/chapter_05/Tab_Completion.md @@ -1,3 +1,4 @@ ### TAB键补全 -即使用了通配符还是觉得有很多工作?没错。当你处理长文件名的时候有一个更加简单的方法:tab键补全。Tab键补全允许你输入能够独特表示出这个文件的几个字符,然后按一下Tab键,bash就会将剩下的补全。即使你没有输入能够足够独特表示出这个文件的字符,shell也会补充尽可能多的字符。输入两次Tab键会显示一个匹配的列表。 +即使用了通配符还是觉得有很多工作?没错。当你处理长文件名的时候有一个更加简单的方法:Tab键补全。Tab键补全允许你输入能够独特表示出这个文件的几个字符,然后按一下Tab键,bash就会将剩下的补全。即使你没有输入能够足够独特表示出这个文件的字符,shell也会补充尽可能多的字符。输入两次Tab键会显示一个匹配的列表。 + diff --git a/chapter_05/Task_Management.md b/chapter_05/Task_Management.md index 0574212..147e4ec 100644 --- a/chapter_05/Task_Management.md +++ b/chapter_05/Task_Management.md @@ -1,14 +1,19 @@ ### 任务管理 -bash还有另一个特点,暂停和恢复任务的能力。这允许你暂时暂停一个正在运行的任务,执行另一些任务,然后重新恢复这一任务或者在后台运行。通过输入'CTRL-Z',bash会暂停正在运行的任务。之后你可以恢复那个任务。你可以通过这个方法暂停多个任务。内建的`job`命令会显示一个被暂停的任务的列表。 +bash还有另一个特点,暂停和恢复任务的能力。这允许你暂时暂停一个正在运行的任务,执行另一些任务,然后重新恢复这一任务或者在后台运行。通过输入`CTRL-Z`,bash会暂停正在运行的任务。之后你可以恢复那个任务。你可以通过这个方法暂停多个任务。内建的`job`命令会显示一个被暂停的任务的列表。 - darkstar:~$ jobs - [1]- Stopped vi TODO - [2]+ Stopped vi chapter_05.xml +``` +darkstar:~$ jobs +[1]- Stopped vi TODO +[2]+ Stopped vi chapter_05.xml +``` 为了恢复被暂停的任务,运行`fg`来将最新暂停的任务恢复到前台运行。如果你有多个任务被暂停可以输入要恢复的任务的序号。 - darkstar:~$ fg # "vi TODO" - darkstar:~$ fg 1 # "vi chapter_05.xml" +``` +darkstar:~$ fg # "vi TODO" +darkstar:~$ fg 1 # "vi chapter_05.xml" +``` 你也可以运行`bg`将任务放入后台运行。这可以让进程继续运行而不会占用shell的控制。要恢复到前台运行,使用`fg`。 + diff --git a/chapter_05/Terminals.md b/chapter_05/Terminals.md index 694dbc3..6ea6246 100644 --- a/chapter_05/Terminals.md +++ b/chapter_05/Terminals.md @@ -2,6 +2,7 @@ Slackware和其他Linux发行版本允许用户以各种方式和系统交互,但是最常用的,也是最有用的就是通过终端。在以前,终端是通过串行连接接到主板或服务器上的键盘和显示器(有时是鼠标)。如今,大部分的终端都是虚拟的,那意味着它们只存在于软件中。虚拟终端允许用户无需使用高昂的和不兼容的硬件来连接到计算机上。通常,用户只需要运行软件,一个自定义的虚拟终端就会呈现在眼前。 -最通用的虚拟终端(每一台Slackware电脑中都至少有一个)是*gettys*。`agetty`默认在Slackware上运行6个终端实例,并允许用户(那些坐在电脑前并在键盘上输入的)登录和运行程序。每一个实例都可以在不同的*tty*设备上获取,通过按*ALT*键加*F1*至*F6*中的任一个键。使用这些实例允许你以不同的用户的身份登录,同时在那些用户的shell上运行程序。对于那些不安装桌面的服务器来说使用的很多,但是在其他机器上也可以用。 +最通用的虚拟终端(每一台Slackware电脑中都至少有一个)是*gettys*。`agetty`默认在Slackware上运行6个终端实例,并允许用户(那些坐在电脑前并在键盘上输入的)登录和运行程序。每一个实例都可以在不同的*tty*设备上获取,通过按`ALT`键加`F1`至`F6`中的任一个键。使用这些实例允许你以不同的用户的身份登录,同时在那些用户的shell上运行程序。对于那些不安装桌面的服务器来说使用的很多,但是在其他机器上也可以用。 + +在台式机、笔记本和其他使用图形化接口的工作站上,大部分的终端是图形化的。Slackware包括很多不同的图形化终端,最常用的是KDE的*konsole*和XFCE的*Terminal*或是老式的*xterm*。如果你使用图形化的终端,查看你的工具栏或者菜单。每一个桌面环境和窗口管理器都有虚拟终端(通常称它们终端模拟器),它们被不同地标记这。如果你使用桌面环境,通常你可以在*系统*菜单中找到它们。执行其中的任何一个,都会显示你一个图形化的终端并运行默认的shell。 -在台式机、笔记本和其他使用图形化接口的工作站上,大部分的终端是图形化的。Slackware包括很多不同的图形化终端,最常用的是KDE的*kconsole*和XFCE的*Terminal*或是老式的*xterm*。如果你使用图形化的终端,查看你的工具栏或者菜单。每一个桌面环境和窗口管理器都有虚拟终端(通常称它们终端模拟器),它们被不同地标记这。如果你使用桌面环境,通常你可以在*系统*菜单中找到它们。执行其中的任何一个,都会显示你一个图形化的终端并运行默认的shell。 diff --git a/chapter_05/What_Is_A_Shell.md b/chapter_05/What_Is_A_Shell.md index 393ffee..5567d75 100644 --- a/chapter_05/What_Is_A_Shell.md +++ b/chapter_05/What_Is_A_Shell.md @@ -1,3 +1,4 @@ ### 什么是Shell? Shell到底是什么呢?Shell基本上是一个命令行的用户环境。本质上来说,它是当用户登录并且运行其他程序时就会运行的程序。从某种程度上说,它和图形化的用户接口很相似,因为它提供了一个执行命令和启动程序的框架。在Slackware中包含很多Shell,但是在本书中我们只讨论bash。高级用户可能会考虑使用更加有力的zsh,而那些对老的UNIX系统的用户可能会使用ksh。而最自虐的是使用csh。对于新手来说使用bash比较好。 + diff --git a/chapter_05/Wildcards.md b/chapter_05/Wildcards.md index 0ef7c9f..dec83a9 100644 --- a/chapter_05/Wildcards.md +++ b/chapter_05/Wildcards.md @@ -2,24 +2,31 @@ 通配符是特殊的字符,用来告诉Shell要匹配的规则。如果你有使用DOS的经验,你会认出*\**是用来匹配任何东西的通配符。bash使用通配符来让你更容易地做你想做的事情。 -第一个也是最常用的就是*\**。星号匹配任何字符和字符的组合,包括空。因此*b\**会匹配任何以b开头的文件,比如b,ba,babc等等。不怎么常用的是*?*。这个字符只匹配单个字符。所以*b?*会匹配ba,bb等,而不会匹配b,bab。 +第一个也是最常用的就是`*`。星号匹配任何字符和字符的组合,包括空。因此`b*`会匹配任何以b开头的文件,比如`b`,`ba`,`babc`等等。不怎么常用的是`?`。这个字符只匹配单个字符。所以`b?`会匹配`ba`,`bb`等,而不会匹配`b`,`bab`。 - darkstar:~$ touch b ba bab - darkstar:~$ ls * - b ba bab - darkstar:~$ ls b? - ba +``` +darkstar:~$ touch b ba bab +darkstar:~$ ls * +b ba bab +darkstar:~$ ls b? +ba +``` -不,有趣的地方还不至于此。除了这两个外,我们还有方括号*\[\]*。方括号允许我们匹配方括号中的字符。当bash看到方括号时,它会替换方括号中的内容。任何字符和数字的组合都可以被指定,用逗号分隔它们。同样的,字符和数字的范围也可以指定。下面举例。 +不,有趣的地方还不至于此。除了这两个外,我们还有方括号`[]`。方括号允许我们匹配方括号中的字符。当bash看到方括号时,它会替换方括号中的内容。任何字符和数字的组合都可以被指定,用逗号分隔它们。同样的,字符和数字的范围也可以指定。下面举例。 - darkstar:~$ ls a[1-4,9] - a1 a2 a3 a4 a9 +``` +darkstar:~$ ls a[1-4,9] +a1 a2 a3 a4 a9 +``` 因为Linux是区分大小写的,大写和小写的字母不同。在ASCII顺序中,大写字母都是位于小写字母之前的。因此当要表示包含大写字母和小写字母的范围时,请确保正确。 - darkstar:~$ ls 1[W-b] - 1W 1X 1Y 1Z 1a 1b - darkstar:~$ ls 1[w-B] - /bin/ls: cannot access 1[b-W]: No such file or directory +``` +darkstar:~$ ls 1[W-b] +1W 1X 1Y 1Z 1a 1b +darkstar:~$ ls 1[w-B] +/bin/ls: cannot access 1[b-W]: No such file or directory +``` + +在第二个案例中,`1[w-B]`是错误的范围,所以shell将其认为是文件名,因为没有那个文件所以告诉你不存在。 -在第二个案例中,*1[w-B]*是错误的范围,所以shell将其认为是文件名,因为没有那个文件所以告诉你不存在。