Shell编程实例——中级shell工具(二)
2026/9/16 23:31:15 网站建设 项目流程

中级shell工具

    • 1、输出排序
    • 2、数字排序
    • 3、IP地址排序
    • 4、提取部分输出
    • 5、删除重复行
    • 6、压缩文件
    • 7、解压文件
    • 8、检查tar归档文件中不重复的目录
    • 转换字符
    • 10、将大写字母转换为小写字母
    • 11、将DOS文件转换为Linux格式
    • 12、删除智能引号
    • 13、统计文件的行数、单词数或字符数
    • 14、重新编排段落
    • 15、你不知道的less

1、输出排序

你想对输出进行排序,但又不想(再次)为程序或 shell脚本编写一个自定义排序函数。有没有现成可用的工具?

使用 sort 实用工具。通过在命令行上指定文件名,你可以对一个或多个文件进行排序。

sortfile1.txt file2.txt myotherfile.xyz

如果不指定文件名,sort 则会从标准输入读取,这样一来,你就可以通过管道将前一个命令的输出传给 sort。

somecommands|sort

对输出进行排序能带来不少便利,如果还不用为每个程序编写排序代码,那就更省事了。shell 的管道功能允许你将 sort 连接到任意程序的标准输出。

sort 有不少选项,最值得记住的有 3 个选项,以下是其中两个。

sort-r

该选项可以按照逆序进行排序(最后一个变成第一个,第一个变成最后一个)​。另外还有:

sort-f

该选项可以“混用”大小写字母,即不区分大小写。同样的效果也可以用 GNU 的长格式选项来实现。

sort--ignore-case

先留一个悬念,2 节再介绍第三个选项。

2、数字排序

对数值进行排序时,你发现结果有问题。

$sortsomedata220021250$

你得用 -n 选项告诉 sort 将数据作为数值排序。

$sort-nsomedata221200250$

第一个排序结果并没有问题(尽管怪异)​,因为它是对数据按照字母排序的(也就是说,21 排在 200 的后面,因为在字母排序中,1 位于 0 之后)​。当然,你需要的可能是按照数值排序,因此得使用 -n 选项。

如果配合 uniq -c 使用,sort -rn 可以非常方便地给出一个按照降序排列的使用频率列表。例如,我们来展示一下系统中最常用的 shell。

$cut-d':'-f7/etc/passwd|sort|uniq-c|sort-rn20/bin/sh10/bin/false2/bin/bash1/bin/sync $

cut -d':' -f7 /etc/passwd用于提取 /etc/passwd 文件中各个用户所使用的 shell。然后,必须先进行一次排序,这样 uniq 才能正常工作。uniq -c 统计连续出现的重复行,这正是我们需要预排序的原因。sort -rn 按照数值进行逆向排序,最常用的 shell 出现在最前面。

如果不需要统计出现次数,只是想得到一个不重复的列表(也就是说,想通过 sort 去掉重复内容)​,那么可以使用sort 命令的 -u 选项(无须使用 uniq 命令)​。因此,要想找出系统中都有哪些 shell,可以使用下列命令。

cut-d':'-f7/etc/passwd|sort-u

3、IP地址排序

你想对数字 IP 地址列表进行排序,但希望按最后部分的数字或在逻辑上按整个地址进行排序。

按照最后一部分数字排序(旧语法)​。

$sort-t.-n+3.0 ipaddr.list10.0.0.2192.168.0.2192.168.0.410.0.0.5192.168.0.1210.0.0.20 $

按照整个 IP 地址排序(POSIX 语法)​。

$sort-t.-k1,1n-k2,2n-k3,3n-k4,4n ipaddr.list10.0.0.210.0.0.510.0.0.20192.168.0.2192.168.0.4192.168.0.12 $

我们知道这些数据都是数值,因此使用了 -n 选项。-t 选项用于指定字段之间的分隔符(这里的分隔符是点号)​,这样就可以指定先按照哪个字段排序了。在第一个例子中,我们在左边找到第 3 个字段(从 0 开始计数)​,从该字段的第 1 个字符(也是从 0 开始计数)开始排序,写作+3.0。

在第二个例子中,我们没有再沿用传统的(已经过时)+pos1 -pos2 格式,而是采用了新的 POSIX 语法规范。与旧格式不同,在 POSIX 语法中,字段是从 1 开始计数的。

sort-t.-k1,1n-k2,2n-k3,3n-k4,4n ipaddr.list

哇,真难看。以下是旧格式,也没好到哪去。

sort-t. +0n-1+1n-2+2n-3+3n-4

两者都用 -t. 来定义字符分隔符,但指定排序字段时就大不一样了。在 POSIX 语法中,-k 1,1n 的意思是“排序起止范围从第一个字段(1)开头至(,)第一个字段(1)末尾,按照数值排序(n)​”​。只要搞明白这部分的写法,剩下的就很简单了。如果使用多个排序字段,重要的是一定要告诉 sort 字段的结束位置。默认是直到行尾才结束,但这通常并不符合我们的要求,要是你不明白这一点,着实会摸不着头脑。

sort 使用的排序方法受到语言环境设置的影响。如果得到的结果与预期不符,你可以检查一下这方面的设置。

排序结果在不同系统上会出现不一致的情况,这取决于sort 命令是否默认使用了稳定排序。如果排序字段内容相同,那么稳定排序会在排序结果中保留其原始顺序。Linux 和 Solaris 默认没有使用稳定排序,而 NetBSD 使用了稳定排序。-S 选项在 NetBSD 上用于关闭稳定排序,但在其他 sort 版本中,该选项用于设置缓冲区大小。

假设我们有一个普通文件:

10.0.0.4# mainframe192.168.0.12# speedy10.0.0.20# lanyard192.168.0.4# office10.0.0.2# sluggish192.168.0.2# laptop

如果在 Linux 或 Solaris 系统上执行下列命令:

sort-t.-k4nipaddr.list

或者在 NetBSD 系统上执行下列命令:

sort-t.-S-k4nipaddr.list

我们得到排序后的结果如下表中第一列所示。去掉NetBSD 系统中的 sort 命令的 -S 选项后,结果如表中第二列所示。



在输入文件 ipaddr.list 中,以 192.168 开头的地址最先出现,接着是 10 开头的地址,如果出现平局(tie)​,也就是两个排序字段的值一样,那么稳定排序会将 192.168 开头的地址放在排序结果的前面。在表中,我们可以看到 laptop 和 sluggish 就是这种情况,因为两者的第四个字段都是 2;mainframe 和 office 也是同理,两者的第四个字段都是 4。在 Linux 的默认排序(以及指定了 -S 选项的 NetBSD)中,无法确保排序结果是稳定的。

要想追求简单实用,可以按照 IP 地址列表中的文本排序。这一次我们选用 # 字符作为分隔符,并按照字母顺序对第二个字段排序,得到的结果如下所示。

$sort-t'#'-k2ipaddr.list10.0.0.20# lanyard192.168.0.2# laptop10.0.0.5# mainframe192.168.0.4# office10.0.0.2# sluggish192.168.0.12# speedy$

排序范围从第二个字段开始,直到行尾。因为每行仅有一个分隔符(#)​,所以不必指定范围的结束位置,不过你也可以写成 -k2,2。

4、提取部分输出

你想要根据列的位置获取固定宽度或分列数据中的一部分。

用带有 -c 选项的 cut 命令提取特定列。

注意,本节中所列举的 ps 命令的例子仅适用于某些系统,如 CentOS-4、Fedora Core 5、Ubuntu,但由于列的位置不同,在 Red Hat 8、NetBSD、Solaris、masOS 中会出现错乱。

$ps-l|cut-c12-15 PID539172857286$

或者:

$ps-elf|cut-c58-(不再显示输出)$

使用 cut 命令时,我们需要指定保留每行的哪一部分。在第一个例子中,我们保留第 12 列(从 1 开始计数)到第15 列(包含在内)​。在第二个例子中,我们指定从第 58列开始,但没有指定结束位置,因此 cut 会一直提取到行尾。

到目前为止,我们看过的大部分数据处理是基于字段,字段之间由分隔符隔开。cut 命令也可以这么做,但它是bash 中少数也能够轻松处理分列数据的工具之一(通过 -c 选项)​。

除了列,cut 也可以输出字段,不过相较于其他工具(如awk)​,限制要更多一些。字段之间的默认分隔符是制表符,你也可以用 -d 选项指定其他分隔符。以下是一个处理字段的 cut 命令。

cut-d'#'-f2<ipaddr.list

与其等价的 awk 命令如下所示。

awk-F'#''{print $2}'<ipaddr.list

你甚至还可以用多个 cut 来处理不一致的分隔符。使用带有正则表达式的 awk 可能效果更好,不过有时一连串快而糙的 cut 更容易理解和键入。

接下来我们将展示如何提取一对中括号之间的字段。注意,第一个 cut 使用左中括号作为分隔符(-d’[‘)​,并提取第 2 个字段(-f2,字段从 1 开始计数)​。在此基础上,第二个 cut 使用右中括号作为分隔符(-d’]')​,并提取第1 个字段。

$catdelimited_data Line[l1]. Line[l2]. Line[l3]. $cut-d'['-f2delimited_data|cut-d']'-f1l1 l2 l3 $

5、删除重复行

选择或排序完数据后,你发现结果中出现了很多重复行。你想要去除这些重复内容。

你有两种选择。如果只对输出进行排序,可以使用 sort 命令的 -u 选项。

somesequence|sort-u

如果不用 sort,则只需要通过管道将输出传给 uniq。但有一个前提:输出是有序的,相同的行集中在一起。

somesequence|uniq>myfile

因为 uniq 要求数据已经事先完成排序,所以我们更可能只使用带有 -u 选项的 sort,除非还需要统计重复行的数量(-c,参见 2 节)或只查看重复行(-d)​,此时才轮到 uniq 上阵。

可别不小心把重要的文件给误覆盖了。uniq命令的参数有点怪。大多数 Unix/Linux 命令可以在命令行上接受多个输入文件,但 uniq 不然。事实上,uniq 的第一个(非选项)参数被视为(唯一的)输入文件,第二个参数(如果指定了)被视为输出文件。因此,如果你在命令行上指定了两个文件名,那么第二个文件会在毫无预警的情况下被覆盖。

6、压缩文件

你需要压缩几个文件,但又不确定最佳的压缩方法。

首先,你得知道在传统 Unix 中,归档(或者称作合并)和文件压缩是两种操作,各自使用的工具也不同,而在DOS 和 Windows 世界中,两者通常是一回事,一种工具就能完成。使用 tar(tape archive,磁带归档)命令合并多个文件或目录,然后再用 compress、gzip 或 bzip2 工具进行压缩,得到的就是“tarball”​,其文件名称类似于tarball.tar.Z、tarball.tar.gz、tarball.tgz 或tarball.tar.bz2。话虽如此,包括 zip 在内的很多其他工具也是支持的。

为了使用正确的格式,需要搞清楚数据将用于何处。如果纯粹只是压缩一些文件自用,怎么方便怎么来就行。如果其他人也要使用你的数据,那就要考虑对方所用的平台以及习惯。

Unix 的传统 tarball 是 tarball.tar.Z,但如今 gzip 用的更多,xz 和 bzip2(压缩率比 gzip 更好)也正在逐渐普及。但还有一个工具问题。有些版本的 tar 允许在创建归档的同时用指定的压缩工具自动压缩。有些版本则不行。

Unix 或 Linux 普遍接受的格式是 tarball.tar.gz,其创建方式如下所示:

$tarcf tarball_name.tar directory_of_files $gziptarball_name.tar $

如果使用的是 GNU tar,那么 -Z 可用于压缩(该选项已经过时)​、-z 用于指定 gzip(最稳妥)​、-j 用于指定 bzip2(压缩率最高)​。别忘了使用适合的文件名,tar 可不会帮你自动生成。例如:

tarczf tarball_name.tgz directory_of_files

虽然 tar 和 gzip 可用于很多平台,但如果涉及Windows,最好还是使用 zip,因为它几乎是通用的。

zip-rzipfile_name directory_of_files

在 Unix 以及其他几乎所有平台上,zip 和 unzip 都是由InfoZip 软件包提供的,但可能并未默认安装。与多数其他 Unix 工具不同,这些工具只执行命令本身的话,输出的是一些辅助的用法信息。另外注意,-l 选项可以将 Unix行尾转换成 DOS 行尾,-ll 则执行相反操作。

这里要讨论的压缩算法和工具太多了,其中还包括 ar、arc、arj、bin、bz2、cab、jar、cpio、deb、hqx、lha、lzh、rar、rpm、uue、zoo。

使用 tar 时,我们强烈建议采用相对路径来保存所有文件。如果使用绝对路径,可能会误覆盖系统中的其他文件。不使用任何路径的话,提取出的文件会七零八散地出 现在用户当前目录下(参见 8 节)​。推荐用法是采用当前正在处理的数据名称和可能的版本号。下表展示了一些例子。

值得一提的是,Red Hat Package Manager(RPM,RedHat 软件包管理器)文件其实就是带有头部信息的 CPIO文件。你可以用名为 rpm2cpio 的 shell 或 Perl 脚本将头部剥离,提取其中的文件。

rpm2cpio some.rpm|cpio-i

Debian 的 .deb 文件其实就是 ar 归档,其中包含经过gzip 或 bzip 压缩的 tar 归档。可以用标准工具 ar、gunzip 或 bunzip2 将其提取出来。

很多 Windows 工具(如 WinZip、PKZIP、FilZip、7-Zip)能处理这里提到的多数或全部格式,甚至包括tarball 和 RPM。

7、解压文件

你需要解压一个或多个扩展名为.tar、.tar.gz、.gz、.tgz、.Z、.zip 的文件。

先搞清楚要处理的文件,然后选择正确的工具。下表列出了常见的扩展名以及能够处理该类文件的程序。此时file 命令可以派上用场,它能告诉你文件是哪种类型,哪怕是文件名有误。


你也不妨试试 file 命令。

$filewhat_is_this.* what_is_this.1: GNUtararchive what_is_this.2:gzipcompressed data, from Unix $ gunzip what_is_this.2 gunzip: what_is_this.2: unknown suffix -- ignored $mvwhat_is_this.2 what_is_this.2.gz $ gunzip what_is_this.2.gz $filewhat_is_this.2 what_is_this.2: GNUtararchive

如果文件扩展名不在表中,而且 file 命令也无济于事,但你确信该文件属于某种归档,那不妨在网上搜一下。

8、检查tar归档文件中不重复的目录

你想提取归档中的文件,但希望提前知道这些文件会写入哪些目录。可以通过 tar -t 查看 tar 归档文件所包含的内容列表,不过这样可能会产生大量输出,容易造成遗漏。

使用 awk 脚本从 tar 归档的内容列表中解析出目录名称,然后用 sort -u 得到不重复的目录名称:

tartf some.tar|awk-F/'{print $1}'|sort-u

t 选项可以为 f 选项指定的 tar 归档文件生成内容列表。awk 命令通过 -F/ 将字段分隔符指定为非默认的斜线。因此,print $1 会输出路径名中的第一个目录名。

最后,对所有目录名排序并仅输出不重复的那些目录。

如果某行输出包含单个点号,那么部分文件就会被提取到当前目录,因此要确保位于所需要的目录中。

与此类似,如果归档文件中的文件名全都是相对路径,起始部分没有 ./,那么会在当前目录下生成一系列文件。

如果输出中出现了空行,这意味着有些文件采用了绝对路径(路径起始部分为 /)​。再次提醒,提取这种归档有可能会误覆盖别的文件。

有些版本的 tar(如 GNU tar)会默认或有选择地剥除路径中的前导 /。这种方式创建的 tarball 要安全得多,但你可别指望所有的 tar 都会这么做。

转换字符

你需要将文本中出现的某个字符全部转换成另一个字符。

可以使用 tr 命令。例如:

tr';'','<be.fore>af.ter

就其最简单的形式而言,tr 命令用第二个参数的第 1 个(仅此)字符替换第一个参数的第 1 个(仅此)字符。

在上述示例中,我们将输入重定向为文件 be.fore,将输出重定向至文件 af.ter,将输入文件中所有的分号替换成了逗号。

为什么要在分号和逗号两边使用单引号呢?这是因为分号在 bash 中有特殊含义,如果不用引号,那么 bash 会将命令拆成两个,这肯定要出错。逗号倒是没有特殊含义,将它放入引号纯粹出于习惯,免得万一忘记什么。坚持使用引号会更安全,这样就永远不会漏写了。

如果使用多个待转换的字符作为第一个参数,要转换成的字符作为第二个参数,那么 tr 命令就会一次性执行多个字符转换。记住,这种转换是一对一进行的。例如:

tr';:.!?'','<other.punct>commas.all

该命令会将分号、冒号、句号、惊叹号、问号全部转换成逗号。因为第二个参数比第一个参数短,所以不断重复第二个参数的最后一个字符(这个例子中就只有一个)来匹配第一个参数的长度,这样一来,字符就能在转换时一一对应了。

sed 命令也能完成这种转换,只不过语法有点麻烦。tr 命令没有那么厉害,因为它无法使用正则表达式,但 tr 有一些特别的字符区间语法,非常有用,10 节将对其进行介绍。

10、将大写字母转换为小写字母

你需要消除文本流中的字母大小写差异。

可以使用 tr 命令并指定字符区间,将所有的大写字母(A-Z)转换成小写字母(a-z)​:

tr'A-Z''a-z'<be.fore>af.ter

tr 还有一种特别的语法,可用于指定大小写字母转换的区间:

tr'[:upper:]''[:lower:]'<be.fore>af.ter

有些版本的 tr 支持当前语言环境的对照顺序(collatingsequence)​,A-Z 不一定总是当前语言环境中的大写字母集合。尽可能使用 [:lower:] 和 [:upper:] 来避开这种问题,不过如此一来,就无法使用子范围(如 N-Z 和 a-m)了。

虽然 tr 不支持正则表达式,但支持字符区间。确保两个参数包含相同数量的字符即可。如果第二个参数长度较短,那么其最后一个字符会不断重复,直到匹配第一个参数的 长度。如果第一个参数较短,第二个参数则会被截断,以匹配第一个参数的长度。

以下使用简单的替换加密算法对一段文本消息进行了简单的编码,这种算法将每个字符偏移 13 个位置(ROT13)​。ROT13 有一个值得注意的地方:相同的过程既可以用于文本加密,也可以用于文本解密。

$cat/tmp/joke Q: Why did the chicken cross the road? A: To get to the other side. $tr'A-Za-z''N-ZA-Mn-za-m'</tmp/joke D: Jul qvq gur puvpxra pebff gur ebnq? N: Gb trg gb gur bgure fvqr. $tr'A-Za-z''N-ZA-Mn-za-m'</tmp/joke|tr'A-Za-z''N-ZA-Mn-za-m'Q: Why did the chicken cross the road? A: To get to the other side.

11、将DOS文件转换为Linux格式

你需要将 DOS 格式的文本文件转换为 Linux 格式。在DOS 中,每行文本由一对字符作结:回车符和换行符。在Linux 中,每行文本仅由单个换行符作结。该如何删除多出的那个 DOS 字符呢?

可以用 tr 命令的 -d 选项删除指定字符。例如,要想删除所有的回车符(\r)​,可以使用下列命令。

tr-d'\r'<file.dos>file.txt

这会删除文件中的所有 \r 字符,而不仅仅是行尾的。典型的文本文件中极少会在行内出现该字符,不过也并非不可能。如果对此有所顾忌,可以考虑 dos2unix 和 unix2dos 程序。

tr 能够识别包括 \r(回车符)和 \n(换行符)在内的一些特殊转义序列。下表列出了各种转义序列。

12、删除智能引号

你想从 MS Word 的文档中提取简单的 ASCII 文本,但将其另存为文本时,仍然有一些奇怪的字符。

将那些奇怪的字符转换成简单的 ASCII 字符。

tr'\221\222\223\224\226\227''\047\047""--'<odd.txt>plain.txt

这种“智能引号”出自 Windows-1251 字符集,也可能会出现在保存为文本的电子邮件消息中。

要想清理这种文本,得用到 tr 命令,将值为 221 和 222(八进制)的弯单引号转换成简单的单引号 。这里我们用八进制值(047)来指定后者,这样更容易处理,因为shell 引用字符串时要用到单引号。223 和 224(八进制)分别是左右弯双引号。可以将直双引号直接放入第二个参数,因为外部的单引号能够避免 shell 对双引号做出解释。226 和 227(八进制)是破折号,它们会被转换成连字符(技术上并不需要第二个参数中的第二个连字符,因为 tr 会重复最后一个字符,使之匹配第一个参数的长度,不过最好还是写清楚)​。

13、统计文件的行数、单词数或字符数

你想知道指定文件有多少行、多少个单词以及多少个字符。

在命令替换中使用 wc(word count,单词统计)命令。

wc 的正常输出如下所示:

$wcdata_file51560data_file# 只显示行数$wc-ldata_file5data_file# 只显示单词数$wc-wdata_file15data_file# 只显示字符数(通常等同于字节数)$wc-cdata_file60data_file# 注意文件大小为60B$ls-ldata_file -rw-r--r--1jpusers60B Dec603:18 data_file

你可能想按照以下方式来做:

data_file_lines=$(wc-l"$data_file")

这不会如你所愿,因为得到的是 “5 data_file” 这样的值。你可能还会看到:

data_file_lines=$(cat"$data_file"|wc-l)

丢掉毫无必要的cat 吧,使用以下命令来避免文件名问题。

data_file_lines=$(wc-l<"$data_file")

如果你使用的 wc 版本支持语言环境,在某些字符集中,文件的字符数量并不等于字节数量。

14、重新编排段落

有些文本行要么太长,要么太短,你希望重新编排来提高可读性。

使用 fmt 命令。

fmtmangled_text

也可以选择指定行的目标长度和最大长度。

fmt5560mangled_text

fmt 的棘手之处是,它期望使用空行来分隔标题和段落。如果输入文件中没有这些空行,那么 fmt 就无法区分不同的段落和同一段落中额外的换行符,结果就是你会得到一个行长度正确的大段落。

pr 命令也可用于文本格式化。

15、你不知道的less

“less 可不止如此(less is more)!”你希望能够更充分地利用分页程序 less 的特性。

这里的 less is more 是一个双关语。原话是由著名的现代主义建筑大师 Ludwig Mies van der Rohe 于 1928 年提出的,意为“少即是多”​。本节引用这句话旨在表达,​“less 命令还有更多可讲的东西”​。

阅读 less 的手册页,使用 $LESS 变量以及~/.lessfilter 和~/.lesspipe 文件。

less 可以从 $LESS 变量中获取选项,因此无须再创建包含偏好选项的别名,只需将选项放入该变量即可。长短选项都能接受,在命令行上指定的选项会覆盖变量中的选项。我们建议在 $LESS 变量中使用长选项,因为这种选项形式更易于阅读。例如:

exportLESS="--LONG-PROMPT --LINE-NUMBERS --ignore-case --QUIET"

这只是个开始而已。less 能利用输入预处理器(inputpreprocessor)进行扩展,此处理器可以是程序或脚本,负责对 less 要显示的文件进行预处理。这是通过对环境变量 $LESSOPEN 和 $LESSCLOSE 做相应设置来实现的。

虽然可以自己动手,但时间能省则省(阅读完随后的讨论部分)​,不妨试试 Wolfgang Friebel 的 lesspipe.sh。该脚本在单独运行时会设置和导出环境变量 $LESSOPEN。

$ ./lesspipe.shLESSOPEN="|./lesspipe.sh %s"exportLESSOPEN$

你只需将其放入 eval 语句,例如 eval$(/path/to/lesspipe.sh) 或 eval '/path/to/lesspipe.sh’中,然后像平常那样使用 less 就行了。1.82 版支持的部分格式包括:

gzip、compress、bzip2、zip、rar、tar、nroff、ar 归档、pdf、ps、dvi、共享库、可执行文件、目录、RPM、Microsoft Word、OASIS (OpenDocument、Openoffice、Libreoffice)格式、Debian、MP3 文件、图像格式(png、gif、jpeg、tiff……)、utf-16 文本、iso 镜像、可通过 /dev/xxx 访问的可移动介质文件系统。

有一点要注意,这些格式需要各种外部工具,没有的话,lesspipe.sh 示例中的有些特性是无法使用的。根据你当前可用的工具,该软件包中的 ./configure(或 make)脚本还可以生成适用于系统的过滤器版本。

less 的独特之处在于,在我们碰到过的所有单一测试系统中,它都是已经默认安装好的 GNU 工具。这一点甚至连bash 都不敢保证。抛开版本差异不谈,less 在所有系统上的表现都一模一样。这实在是很了不起,值得大书特书。

但是,对于 lesspipe* 和 $LESSOPEN 过滤器而言,可就不是这么回事了。除了 8.15.2 节中列出的那些,我们还发现了功能各异的其他版本。

  • Red Hat 包含 /usr/bin/lesspipe.sh,但不能像 eval’/path/to/less pipe.sh’ 这样使用。
  • Debian 包含 /usr/bin/lesspipe,但不能用于 eval,另外还通过~/.lessfilter 文件支持额外的过滤器。
  • SUSE Linux 包含 /usr/bin/lessopen.sh,但不能用于eval。
  • FreeBSD 包含一个不起眼的 /usr/bin/lesspipe.sh(不能用于 eval,不支持 .Z、.gz、.bz2)​。
  • Solaris、HP-UX、其他版本的 BSD 和 macOS 默认什么都没有。

要想知道自己的系统中是否有这些文件,可以试验一下。

Debian 系统包含 lesspipe,但并未使用(因为没有定义$LESSOPEN)​。

$typelesspipe.sh;typelesspipe;set|grepLESS -bash3: type: lesspipe.sh: not found lesspipe is /usr/bin/lesspipe $

Ubuntu 系统包含并使用了 Debian lesspipe。

$typelesspipe.sh;typelesspipe;set|grepLESS -bash: type: lesspipe.sh: not found lesspipe is hashed(/usr/bin/lesspipe)LESSCLOSE='/usr/bin/lesspipe %s %s'LESSOPEN='| /usr/bin/lesspipe %s'$

我们推荐你下载、配置并使用 Wolfgang Friebel 的lesspipe.sh,因为其功能最为全面。另外还建议你阅读less 的手册页,其内容非常有意思。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询