中级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-u3、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-iDebian 的 .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-ut 选项可以为 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.tertr 还有一种特别的语法,可用于指定大小写字母转换的区间:
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_textfmt 的棘手之处是,它期望使用空行来分隔标题和段落。如果输入文件中没有这些空行,那么 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 的手册页,其内容非常有意思。