16.9 杂项命令
找不到特定类别进行归类的命令
jot, seq
这些实用程序会生成一系列整数,且用户可选择增加量。
每个整数之间的默认分隔符是换行符,但这可以使用-s选项进行更改。
bash$ seq 5
1
2
3
4
5
bash$ seq -s : 5
1:2:3:4:5jot和seq在for循环中都能派上用场。
样例 16-54. 使用seq生成循环参数
一个更为简单的例子:
样例 16-55. 数字母
jot是一个经典的UNIX实用程序,比seq的功能更强,然而通常不包含在标准Linux发行版中。但是,源rpm包可以从MIT库中下载。
与seq不同,jot可以使用-r选项来生成随机数序列。
getopt
getopt命令用于解析带有破折号的命令行选项。此外部命令对应getopts Bash内置程序。getopt命令可以通过-l标志处理长选项,并且不要求参数顺序。
样例 16-56. 使用getopt来解析命令行参数
正如Peggy Russell指出:
请参阅样例 10-5getopt程序简化模拟。
run-parts
run-parts命令 [[1]](https://tldp.org/LDP/abs/html/extmisc.html#FTN. AEN14105) 按文件名的ASCII码顺序执行目标目录中的所有脚本。当然,脚本需要具有执行权限。
cron命令 守护进程会调用run-parts来执行位于/etc/cron.*中的脚本。
yes
默认yes命令将字符y的连续不断地馈送到标准输出(stdout)。键入control-C终止运行。可以指定不同的输出字符串,例如在yes different string中,将不断从标准输出(stdout)输出different string。
你可能会问这样做有何目的。从命令行或脚本中,yes的输出可以重定向或通过管道传输到期望用户输入的程序中。实际上,这成为了expect脚本用于man文档中的一种不好的写法。
yes | fsck /dev/hda1将在非交互模式下运行fsck(小心!)。
yes | rm -r dirname与rm -rf dirname等效(小心!)。
yes命令会解析变量,更加确切地说,它输出被解析的变量。例如:
这个特定的 “功能” 可用于动态创建一个非常大的ASCII文件:
请快速地键入Ctl-C,计算机可不会和你讨价还价. . . .
我们可以在非常简单的脚本函数中模拟yes命令。
banner
使用ASCII字符 (默认为 “#”) 将参数展现为垂直横幅并打印在标准输出(stdout)上。也可以重定向到打印机进行硬拷贝。
请注意banner命令在许多Linux发行版上已经删除,大概是因为它不再被认为有用。
printenv
显示指定用户设置的所有环境变量。
lp
lp和lpr命令用于将文件发送到打印队列,以进行硬拷贝。[2] 这些命令名可以追溯到另一个时代的行式打印机(line printer)。[3]
bash$ lp file1.txt or bash$ lp <file1.txt
将由pr生成的格式化文本通过管道输出到lp很有用。
bash$ pr -options file1.txt | lp
格式化软件包 (例如groff和Ghostscript) 可能会将其输出直接发送到lp进行处理。
bash$ groff -Tascii file.tr | lp
bash$ gs -options | lp file.ps
相关命令是用于查看打印队列的lpq,和用于从打印队列中删除作业的lprm。
tee
[这是UNIX借鉴水暖行业的一个想法。]
这是一个重定向运算符,但有一点区别。像水管工的tee一样,它允许将一个或多个命令的输出 “虹吸” 到一个文件中,但不会影响结果。这对于将正在进行的过程打印到文件或纸张上很有用,也许可以通过它进行调试。
mkfifo
这个模糊的命令创建了一个命名管道,一个临时的先进先出(first-in-first-out,即FIFO)缓冲区,用于在进程之间传输数据。[4] 通常,一个进程写入FIFO,另一个进程从中读取。请参阅样例 A-14。
pathchk
此命令用于检查文件名的有效性。如果文件名超过允许的最大长度 (255个字符),或者其路径中的一个或多个目录不可搜索,则会显示一条错误消息。
不幸的是,pathchk不会返回可识别的错误代码,因此在脚本中几乎没有用。实际情况下,可以考虑使用文件测试运算符。
dd
尽管这个有点晦涩和令人恐惧的数据复制器命令起源于UNIX小型机和IBM大型机之间交换磁带上的数据,但它仍然有其用途。dd命令作用只是复制一个文件 (或标准输入(stdin) / 标准输出(stdout)),但具有转换功能,包括ASCII/EBCDIC,[5]大写/小写,在输入和输出之间交换字节对,以及跳过和/或截断输入文件的头或尾。
dd的一些基本参数:
if=INFILE
INFILE是源文件。
of=OUTFILE
OUTFILE是目标文件,是写入数据的文件。
bs=BLOCKSIZE
这是读取和写入的每个数据块的大小,通常为2的幂。
skip=BLOCKS
在复制之前,要在INFILE中跳过多少个数据块。当INFILE开头中有 “垃圾” 或乱码数据时,或者当希望仅复制INFILE的一部分时,这是一个很有用的选项。
seek=BLOCKS
在复制之前,要在OUTFILE中跳过多少个数据块,在OUTFILE开头留下空白数据。
count=BLOCKS
仅复制这么多数据块,而不是整个INFILE。
conv=CONVERSION
在复制操作之前应用到INFILE数据的转换方法。
dd --help会列出该强大命令的所有选项。
样例 16-57. 一个复制自己的脚本
样例 16-58. 练习dd命令
为了演示dd的丰富功能,让我们用它来捕获键盘输入。
样例 16-59. 捕获键盘输入
dd命令可以对数据流进行随机访问。
dd命令可以将原始数据和磁盘映像复制到设备,例如软盘和磁带驱动器 (样例 A-5)。一个常见的用途是创建引导软盘。
dd if=kernel-image of=/dev/fd0H1440
同样,dd可以将软盘的全部内容 (甚至是用 “外来” 操作系统格式化的软盘) 作为镜像文件复制到硬盘驱动器。
dd if=/dev/fd0 of=/home/bozo/projects/floppy.img
同样,dd可以创建可引导的闪存驱动器和sd卡。
dd if=image.iso of=/dev/sdb
样例 16-30. 在SD卡上刻录可启动的树莓派系统
dd的其他应用包括初始化临时交换文件(样例 31-2)和Ramdisk(样例31-3)。它甚至可以对整个硬盘驱动器分区进行低级复制,尽管通常不建议这样做。
人们 (可能与他们的空闲时间没有更好的关系) 一直在思考dd命令的有趣应用。
样例 16-61. 安全地删除一个文件
od
od,即八进制转储过滤器,将输入 (或文件) 转换为八进制 (base-8) 或其他基数。作为一个二进制数据过滤器,这对于查看或处理二进制数据文件或其他不可读的系统设备文件 (例如/dev/urandom) 很有用。
hexdump
执行二进制文件的十六进制、八进制、十进制或ASCII转储。此命令与上面的od命令大致等效,但作用不大。可结合dd和less查看二进制文件的内容。
objdump
以十六进制或反汇编清单 (带有-d选项)的形式,显示有关目标文件或二进制可执行文件的信息。
mcookie
此命令生成 “魔术cookie”,即128位 (32字符) 伪随机十六进制数,通常由X服务器用作授权 “签名”。这也可以在脚本中用于生成 “快捷实用”的随机数。
当然,出于相同目的脚本也可以使用md5sum命令。
mcookie 命令提供了另一种生成 “唯一” 文件名的方法。
样例 16-52. 文件名生成器
units
此实用程序用于在不同的度量单位之间进行转换。通常通过交互模式进行调用,unit也可能会在脚本中使用。
m4
恭喜你找到这个宝藏命令,m4是一个强大的宏[6]处理过滤器,实际上是一个完整的语言。尽管最初作为RatFor的预处理器,但其实m4作为独立的实用程序也很有用。实际上,m4除了大量的宏扩展功能外,还结合了eval,tr和awk的一些功能。
2002年4月期的《Linux Journal》有一篇介绍m4及其用途的非常好的文章。
样例 16-64. m4牛刀小试
xmessage
这种基于X的echo变体在会桌面上弹出一个消息/查询窗口。
zenity
zenity实用程序用于显示GTK+对话窗口小部件,非常适合用于编写脚本。
doexec
doexec命令允许将任意参数列表传递给二进制可执行文件。特别是当传递argv[0] (在脚本中对应于$0)时,可以通过各种名称调用可执行文件,然后根据调用它的名称执行不同的操作集。这相当于将选项参数传递给可执行文件的这种方式。
例如,/usr/local/bin目录可能包含一个名为 “aaa” 的二进制文件。调用doexec /usr/local/bin/aaa list将列出当前工作目录中所有以 “a” 开头的文件,而调用 (相同的可执行文件) doexec /usr/local/bin/aaa delete将删除这些文件。
可执行文件的各种行为必须在可执行文件自身代码中定义,类似于shell脚本中的以下内容:
dialog
dialog工具系列提供了一种从脚本中调用交互式 “对话框” 的方法。dialog的更精细的变体 -- gdialog、Xdialog和kdialog -- 实际上调用了X-Windows窗口小部件。
sox
sox或 “声音交换” 命令用于播放和转换音频文件。实际上,/usr/bin/play可执行文件 (现已弃用) 不过是sox的shell包装器。
例如,sox soundfile.wav soundfile.au将WAV音频文件更改为 (Sun音频格式) AU音频文件。
Shell脚本非常适合对音频文件进行sox批处理。有关样例,请参见Linux Radio Timeshift HOWTO和MP3do Project。
注记
[1]这实际上改编自Debian Linux发行版的脚本。
[2]打印队列是指一组“等待”打印的作业组。
[3]大型机械行式打印机一次将一行字体打印到互相连接的greenbar纸上,并伴随着[大量的噪音](The IBM 1403 Printer)。所印刷的硬拷贝被称为printout。
[4]有关此主题的出色概述,请参阅1997年9月期《Linux Journal》中的Andy Vaught所著的文章《命名管道简介》”。
[5]EBCDIC (发音为 “ebb-sid-ick”) 是扩展二进制编码的十进制交换码 (一种过时的IBM数据格式) 的首字母缩写。dd的conv=ebcdic选项的一个奇怪应用场景是作为一个“快捷简单”,但不是很安全的文本文件编码器。
[6]宏是一个符号常数,它扩展为一个命令字符串或一组对参数的操作集。简单地说,它是一个快捷方式或缩写。
最后更新于
这有帮助吗?