xargs手册页翻译

名字

xargs – 从标准输入创建并执行命令

摘要

xargs [-0prtx] [-E eof-str] [-e[eof-str]] [–eof[=eof-str]] [–null] [-d delimiter] [–delimiter delimiter] [-I replace-str] [-i[replace-str]][–replace[=replace-str]] [-l[max-lines]] [-L max-lines] [–max-lines[=max-lines]] [-n max-args] [–max-args=max-args] [-s max-chars][–max-chars=max-chars] [-P max-procs] [–max-procs=max-procs] [–interactive] [–verbose] [–exit] [–no-run-if-empty] [–arg-file=file][–show-limits] [–version] [–help] [command [initial-arguments]]

说明

该手册主要针对GNU版本的xargs。xargs读取标准输入,以空白符(为防止被shell识别,这些空白符能被单双引号引起来或反斜线转义)或换行符来切分,并以切分后的输入为初始参数一次或多次执行指定命令(默认是/bin/echo)。标准输入流中的空行会被忽略。
因为Unix文件名能包含空白符或换行符,所以默认操作经常会有问题;xargs处理文件名包含空白符或换行符的情况时会发生错误。这种情况下最好使用-0选项,它能防止这个问题。使用这个选项时你要确保为xargs生成输入的程序使用null字符做为分隔符。例如使用find命令来产生输入时使用-print0选项。

如果这些命令的退出码为255,xargs会立即退出并停止读取其它输入。这种情况下标准错误流会打印错误信息。

选项

–arg-file=file
-a file
从文件而不是从标准输入流中读取输入。如果你使用这个选项,当命令执行时标准输入流仍保持不变。否则标准输入流会被重定向为/dev/null。

–null
-0 使用空字符而不是空白字符来分隔输入条目,并且引号和反斜线不再特殊对待(每个字符都按其字面意思来理解)。该选项就像对待其它参数一样禁用文件结束符。当输入条目包含空格,引号或反斜线时这个选项就很有用了。GNU的find程序的-print0选项产生的输入适合这种模式。

–delimiter=delim
-d delim
输入条目使用指定的终止符。引号和反斜线不再特殊,输入里的每个字符都按字面意思来理解。该选项像对待其它参数一样禁用文件结束符。这可以用在当输入条目是以换行符来分隔的情况,虽然通常情况下尽可能的设计你的程序来使用–null会更好。指定的分隔符可以是单个字符,如\n等c风格的转义字符,八进制或十六进制的转义码。八进制或十六进制的转义码规则与printf命令相同。不支持多个字符。

-E oef-str
将文件结束符设置为eof-str。如果一行输入中出现了文件结束符,输入中剩余的部分会被忽略。如果-E或-e都没有使用,则不使用文件结束符。

–eof[=eof-str]
-e[eof-str]
这个选项与-E意义相同.最好使用-E,因为它是POSIX标准兼容的而该选项不是。如果eof-str被省略,则不指定文件结束符。如果-E或-e都没有使用,则不使用文件结束符。

–help 打印xargs选项的摘要并退出
-I replace-str
将初始参数中出现的replace-str替换为从标准输入流中读取的名字。另外,未被引起来的空白符不会终结输入条目;这里的分隔符是换行符。使用该选项也隐含着使用了-x和-L 1.

–replace[=replace-str]
-i[replace-str]
如果指定了replace-str,这个选项与-Ireplace-str意义相同,其它情况下与-I{}相同。不推荐使用这个选项,建议使用-I。

-L max-lines
每个命令行使用最多max-lines个非空输入行。行尾的空白符会将下一个输入行拼接到该行当做同一个逻辑行。暗含使用了-x。

–max-lines[=max-lines]
-l[max-lines]
与-L意义相同。与-L不同的是max-lines参数是可选的,如果不指定max-lines,其默认值为1。因为POSIX标准指定了-L,所以不建议使用该选项。

–max-args=max-args
-n max-args
每个命令行使用最多max-args个参数。如果大小(参见-s选项)溢出,实际使用的参数会小于max-args,这种情况下除非指定了-x选项,否则xargs会直接退出。

–interactive
-p 提示用户是否执行每条命令并从终端读取一行,只有用户的响应以’y’或’Y’开头时才执行。隐含使用了-t。

–no-run-if-empty
-r 如果标准输入流不包含任何非空字符,则不执行命令。通常情况下,即使没有输入命令还是会执行一次。这个选项是GNU扩展的。

–max-chars=max-chars
-s max-chars 每个命令行使用最多max-chars个字符,包括命令本身、初始化参数以及参数字符串结尾的终止符。允许的最大值与系统有关,并且是做为exec的参数长度限制来计算的,所以要比你环境的大小小,也小于2048个净长度。如果设置的长度大于128KB,则默认为128KB,否则默认值为最大值。1KB是1024B。

–verbose
-t 在执行命令前在标准错误流上打印该命令行。

–version
打印xargs的版本号并退出

–show-limits
显示操作系统限制的命令行长度、xargs选择的缓冲区大小以及-s选项。如果你不想让xargs做任何事情,可以把标准输入流重定向为/dev/null(或者指定–no-run-if-empty)。

–exit
-x 输入命令行长度(参见 -s选项)溢出就直接退出。

–max-procs=max-procs
-P max-procs
最多同时开max-procs个进程,默认为1。如果max-procs是0,xargs会一次开尽可能多的进程。请和-n一起使用-P,否则有可能只执行一个进程。

例子

find /tmp -name core -type f -print | xargs /bin/rm -f
在/tmp及其子目录下查找名为core的文件并删除它们。请注意如果任何一个文件名中包含了换行符或空格,程序就会无法正常工作。

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
在/tmp或其子目录下查找名字为core的文件并删除它们,即使文件或目录名中包含了空格或换行符,程序也能正常运行。

find /tmp -depth -name core -type f -delete
在/tmp或其子目录下查找名字为core的文件并删除它们,便比上面的例子效率更高(因为不用使用fork(2)与exec(2)来启动rm,我们也不用开额外的xargs进程)。

cut -d: -f1 < /etc/passwd | sort | xargs echo
生成一个该系统上用户的简洁列表

xargs sh -c ’emacs “$@” < /dev/tty’ emacs
从xargs的标准输入流中读取文件名,并启动所需要的最小数量的Emacs副本来一个接一个的编辑它们。这个例子与BSD中的-o选项效果相同,但它更灵活且移植性更好。

退出码

xargs有以下几个退出状态
0 如果命令执行成功
123 如果任何一个命令以状态1-125退出
125 如果命令返回码为255
125 如果命令被信号杀掉
126 如果找不到命令
1 其它错误
大于128的错误码被shell用来指定因致命信号而导致程序的死掉情况。

标准符合度

自从GNU4.2.9版本的xargs开始,xargs默认没有逻辑文件结束标记符。POSIX(IEEE Std 1003.1, 2004 Edition)允许这种情况。
-l和-i选项出现在1997年版本的POSIX标准中,但没有出现在2004年版本的标准中。因此你应该分别使用-L和-I。
POSIX标准允许实现限制exec函数的参数大小。这些限制可能低至4096个字节,这还包括环境的大小。为了脚本的可移植性,请不要使用比这更大的数值。然而,我没听说过有任何实现的限制会这么小。–show-limits选项可以用来发现当前系统实际的强制限制。

参见其它

find(1), locaate(1), locatedb(5), updatedb(1), fork(2), execvp(2)。查找文件(Info在线命令,或打印的文件)

BUGS

-L选项与-I选项不兼容,但也许会兼容。
你不可能很安全的来使用xargs,因为生成输入文件列表与将它们做为参数用于命令行上有一个时间差。如果其它人能访问系统,他们可以在这个时间窗口中内操作文件系统,强制操作你xargs将要操作的文件,这些你都无法预料到。想要了解详细讨论或相关问题,请参阅findutils Texinfo文档的“Security Considerations”章节。find命令的-execdir是一个更安全的选择。

当你使用-I选项时,从输入中读取的每一行都被内部缓存了。这意味着当你使用-I选项时xargs能接受的输入长度有个上限。要解决这个限制,你可以使用-s选项来增大xargs使用的缓冲区的大小,也可以调用额外的xargs来确保不出现非常长的行。例如:
somecommand | xargs -s 50000 echo | xargs -I ‘{}’ -s 100000 rm ‘{}’
这里,第一个xargs调用因为没有使用-i选项,它没有输入行长度限制。第二个xargs调用有这个限制,但我们保证了它不会遇到比它能处理的更长的行。这并不是一个理想的解决方案。相反,-i选项不应该用来限制输入行的长度,这也是这个讨论为什么会出现在BUGS一节。当使用find(1)的输出时这个问题不会出现,因为它每行只产生一个文件。

报告Bug的最好方式是使用http://savannah.gnu.org/bugs/?group=findutils中的形式。因为你以后可以跟踪Bug修改的进程。关于xargs(1)和findutils包的其它意见一般来说可以发到bug-findutils邮件列表。想要加入邮件列表,可以发邮件到bug-findutils-request@gnu.org。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据