16.9 杂项命令

找不到特定类别进行归类的命令

jot, seq

这些实用程序会生成一系列整数,且用户可选择增加量。

每个整数之间的默认分隔符是换行符,但这可以使用-s选项进行更改。

bash$ seq 5
1
 2
 3
 4
 5



bash$ seq -s : 5
1:2:3:4:5

jotseqfor循环arrow-up-right中都能派上用场。

样例 16-54. 使用seq生成循环参数

一个更为简单的例子:

样例 16-55. 数字母

notejot是一个经典的UNIX实用程序,比seq的功能更强,然而通常不包含在标准Linux发行版中。但是,源rpm包可以从MIT库中下载。

seq不同,jot可以使用-r选项来生成随机数序列。

getopt

getopt命令用于解析带有破折号arrow-up-right的命令行选项。此外部命令对应getoptsarrow-up-right Bash内置程序。getopt命令可以通过-l标志处理长选项,并且不要求参数顺序。

样例 16-56. 使用getopt来解析命令行参数

note正如Peggy Russell指出:

通常需要包含一个eval程序arrow-up-right来正确处理空格arrow-up-right引号

请参阅样例 10-5arrow-up-rightgetopt程序简化模拟。

run-parts

run-parts命令 [[1]](https://tldp.org/LDP/abs/html/extmisc.html#FTN. AEN14105) 按文件名的ASCII码顺序执行目标目录中的所有脚本。当然,脚本需要具有执行权限。

cron命令arrow-up-right 守护进程arrow-up-right会调用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 dirnamerm -rf dirname等效(小心!)。

note请注意,将yes通过管道传输到具有潜在危险的系统命令(例如fsckarrow-up-rightfdiskarrow-up-right)时,可能会产生非预期的后果。

noteyes命令会解析变量,更加确切地说,它输出被解析的变量。例如:

这个特定的 “功能” 可用于动态创建一个非常大的ASCII文件:

请快速地键入Ctl-C,计算机可不会和你讨价还价. . . .

我们可以在非常简单的脚本函数arrow-up-right中模拟yes命令。

使用ASCIIarrow-up-right字符 (默认为 “#”) 将参数展现为垂直横幅并打印在标准输出(stdout)上。也可以重定向到打印机进行硬拷贝。

请注意banner命令在许多Linux发行版上已经删除,大概是因为它不再被认为有用。

printenv

显示指定用户设置的所有环境变量arrow-up-right

lp

lplpr命令用于将文件发送到打印队列,以进行硬拷贝。[2]arrow-up-right 这些命令名可以追溯到另一个时代的行式打印机(line printer)。[3]arrow-up-right

bash$ lp file1.txt or bash$ lp <file1.txt

将由pr生成的格式化文本通过管道输出到lp很有用。

bash$ pr -options file1.txt | lp

格式化软件包 (例如groffarrow-up-rightGhostscript) 可能会将其输出直接发送到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]arrow-up-right 通常,一个进程写入FIFO,另一个进程从中读取。请参阅样例 A-14arrow-up-right

pathchk

此命令用于检查文件名的有效性。如果文件名超过允许的最大长度 (255个字符),或者其路径中的一个或多个目录不可搜索,则会显示一条错误消息。

不幸的是,pathchk不会返回可识别的错误代码,因此在脚本中几乎没有用。实际情况下,可以考虑使用文件测试运算符arrow-up-right

dd

尽管这个有点晦涩和令人恐惧的数据复制器命令起源于UNIX小型机和IBM大型机之间交换磁带上的数据,但它仍然有其用途。dd命令作用只是复制一个文件 (或标准输入(stdin) / 标准输出(stdout)),但具有转换功能,包括ASCII/EBCDIC,[5]arrow-up-right大写/小写,在输入和输出之间交换字节对,以及跳过和/或截断输入文件的头或尾。

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-5arrow-up-right)。一个常见的用途是创建引导软盘。

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-2arrow-up-right)和Ramdisk(样例31-3arrow-up-right)。它甚至可以对整个硬盘驱动器分区进行低级复制,尽管通常不建议这样做。

人们 (可能与他们的空闲时间没有更好的关系) 一直在思考dd命令的有趣应用。

样例 16-61. 安全地删除一个文件

另请参阅参考文献arrow-up-right中的dd线程arrow-up-right条目。

od

od,即八进制转储过滤器,将输入 (或文件) 转换为八进制 (base-8) 或其他基数。作为一个二进制数据过滤器,这对于查看或处理二进制数据文件或其他不可读的系统设备文件arrow-up-right (例如/dev/urandom) 很有用。

另请参阅样例 9-16arrow-up-right样例 A-36arrow-up-right

hexdump

执行二进制文件的十六进制、八进制、十进制或ASCII转储。此命令与上面的od命令大致等效,但作用不大。可结合ddarrow-up-rightlessarrow-up-right查看二进制文件的内容。

objdump

以十六进制或反汇编清单 (带有-d选项)的形式,显示有关目标文件或二进制可执行文件的信息。

mcookie

此命令生成 “魔术cookie”,即128位 (32字符) 伪随机十六进制数,通常由X服务器用作授权 “签名”。这也可以在脚本中用于生成 “快捷实用”的随机数。

当然,出于相同目的脚本也可以使用md5sumarrow-up-right命令。

mcookie 命令提供了另一种生成 “唯一” 文件名的方法。

样例 16-52. 文件名生成器

units

此实用程序用于在不同的度量单位之间进行转换。通常通过交互模式进行调用,unit也可能会在脚本中使用。

m4

恭喜你找到这个宝藏命令,m4是一个强大的宏[6]arrow-up-right处理过滤器,实际上是一个完整的语言。尽管最初作为RatFor的预处理器,但其实m4作为独立的实用程序也很有用。实际上,m4除了大量的宏扩展功能外,还结合了evalarrow-up-righttrarrow-up-rightawkarrow-up-right的一些功能。

2002年4月期的《Linux Journal》arrow-up-right有一篇介绍m4及其用途的非常好的文章。

样例 16-64. m4牛刀小试

xmessage

这种基于X的echoarrow-up-right变体在会桌面上弹出一个消息/查询窗口。

zenity

zenityarrow-up-right实用程序用于显示GTK+对话窗口小部件arrow-up-right非常适合用于编写脚本arrow-up-right

doexec

doexec命令允许将任意参数列表传递给二进制可执行文件。特别是当传递argv[0] (在脚本中对应于$0arrow-up-right)时,可以通过各种名称调用可执行文件,然后根据调用它的名称执行不同的操作集。这相当于将选项参数传递给可执行文件的这种方式。

例如,/usr/local/bin目录可能包含一个名为 “aaa” 的二进制文件。调用doexec /usr/local/bin/aaa list列出当前工作目录中所有以 “a” 开头的文件,而调用 (相同的可执行文件) doexec /usr/local/bin/aaa delete删除这些文件。

note可执行文件的各种行为必须在可执行文件自身代码中定义,类似于shell脚本中的以下内容:

dialog

dialogarrow-up-right工具系列提供了一种从脚本中调用交互式 “对话框” 的方法。dialog的更精细的变体 -- gdialogXdialogkdialog -- 实际上调用了X-Windows窗口小部件arrow-up-right

sox

sox或 “声音交换” 命令用于播放和转换音频文件。实际上,/usr/bin/play可执行文件 (现已弃用) 不过是sox的shell包装器。

例如,sox soundfile.wav soundfile.au将WAV音频文件更改为 (Sun音频格式) AU音频文件。

Shell脚本非常适合对音频文件进行sox批处理。有关样例,请参见Linux Radio Timeshift HOWTOarrow-up-rightMP3do Projectarrow-up-right

注记

[1]arrow-up-right这实际上改编自Debian Linux发行版的脚本。

[2]arrow-up-right打印队列是指一组“等待”打印的作业组。

[3]arrow-up-right大型机械行式打印机一次将一行字体打印到互相连接的greenbar纸上,并伴随着[大量的噪音](The IBM 1403 Printerarrow-up-right)。所印刷的硬拷贝被称为printout

[4]arrow-up-right有关此主题的出色概述,请参阅1997年9月期《Linux Journal》arrow-up-right中的Andy Vaught所著的文章《命名管道简介》arrow-up-right”。

[5]arrow-up-rightEBCDIC (发音为 “ebb-sid-ick”) 是扩展二进制编码的十进制交换码 (一种过时的IBM数据格式) 的首字母缩写。ddconv=ebcdic选项的一个奇怪应用场景是作为一个“快捷简单”,但不是很安全的文本文件编码器。

[6]arrow-up-right是一个符号常数,它扩展为一个命令字符串或一组对参数的操作集。简单地说,它是一个快捷方式或缩写。

最后更新于

这有帮助吗?