您的位置:首页 > 其它

UNIX高手的10个习惯之三

2010-05-12 14:05 363 查看
[align=left]Michael Stutz (stutz@dsl.org), 作家, 顾问[/align]
[align=left](本文出自IBM developerWorks 中国)[/align]

[align=left]###############上接UNIX高手的10个习惯之一#################[/align]

[align=left]第六弹 在列表中对命令分组[/align]
[align=left]大多数 Shell 都具有在列表中对命令分组的方法,以便您能将它们的合计输出向下传递到某个管道,或者将其任何部分或全部流重定向到相同的地方。您一般可以通过在某个 Subshell 中运行一个命令列表或通过在当前 Shell 中运行一个命令列表来实现此目的。[/align]
[align=left]在 Subshell 中运行命令列表[/align]
[align=left]使用括号将命令列表包括在单个组中。这样做将在一个新的 Subshell 中运行命令,并允许您重定向或收集整组命令的输出,如以下示例所示:[/align]
[align=left]清单 11. 好习惯 6 的示例:在 Subshell 中运行命令列表[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \[/align]
[align=left]> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \[/align]
[align=left]> | mailx admin -S "Archive contents"[/align]
[align=left] [/align]
[align=left]在此示例中,该存档的内容将提取到 tmp/a/b/c/ 目录中,同时将分组命令的输出(包括所提取文件的列表)通过邮件发送到地址 admin。[/align]
[align=left]当您在命令列表中重新定义环境变量,并且您不希望将那些定义应用于当前 Shell 时,使用 Subshell 更可取。[/align]
[align=left]在当前 Shell 中运行命令列表[/align]
[align=left]将命令列表用大括号 ({}) 括起来,以在当前 Shell 中运行。确保在括号与实际命令之间包括空格,否则 Shell 可能无法正确解释括号。此外,还要确保列表中的最后一个命令以分号结尾,如以下示例所示:[/align]
[align=left]清单 12. 好习惯 6 的另一个示例:在当前 Shell 中运行命令列表[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~ $ { cp ${VAR}a . && chown -R guest.guest a && \[/align]
[align=left]> tar cvf newarchive.tar a; } | mailx admin -S "New archive"[/align]
[align=left] [/align]
[align=left]第七弹 在 find 之外使用 xargs[/align]
[align=left]使用 xargs 工具作为筛选器,以充分利用从 find 命令挑选的输出。find 运行通常提供与某些条件匹配的文件列表。此列表被传递到 xargs 上,后者然后使用该文件列表作为参数来运行其他某些有用的命令,如以下示例所示:[/align]
[align=left]清单 13. xargs 工具的经典用法示例[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~ $ find some-file-criteria some-file-path | \[/align]
[align=left]> xargs some-great-command-that-needs-filename-arguments[/align]
[align=left] [/align]
[align=left]然而,不要将 xargs 仅看作是 find 的辅助工具;它是一个未得到充分利用的工具之一,当您养成使用它的习惯时,将会希望进行所有试验,包括以下用法。[/align]
[align=left]传递空格分隔的列表[/align]
[align=left]在最简单的调用形式中,xargs 就像一个筛选器,它接受一个列表(每个成员分别在单独的行上)作为输入。该工具将那些成员放置在单个空格分隔的行上:[/align]
[align=left]清单 14. xargs 工具产生的输出示例[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~ $ xargs[/align]
[align=left] a[/align]
[align=left] b[/align]
[align=left] c[/align]
[align=left][/align]
[align=left] Control-D[/align]
[align=left] [/align]
[align=left]a b c[/align]
[align=left]~ $[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]您可以发送通过 xargs 来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:[/align]
[align=left]清单 15. xargs 工具的使用示例[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~/tmp $ ls -1 | xargs[/align]
[align=left]December_Report.pdf README a archive.tar mkdirhier.sh[/align]
[align=left]~/tmp $ ls -1 | xargs file[/align]
[align=left]December_Report.pdf: PDF document, version 1.3[/align]
[align=left]README: ASCII text[/align]
[align=left]a: directory[/align]
[align=left]archive.tar: POSIX tar archive[/align]
[align=left]mkdirhier.sh: Bourne shell script text executable[/align]
[align=left]~/tmp $[/align]
[align=left] [/align]
[align=left]xargs 命令不只用于传递文件名。您还可以在需要将文本筛选到单个行中的任何时候使用它:[/align]
[align=left]清单 16. 好习惯 7 的示例:使用 xargs 工具来将文本筛选到单个行中[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]~/tmp $ ls -l | xargs[/align]
[align=left]-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 \[/align]
[align=left]root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \[/align]
[align=left]16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \[/align]
[align=left]joe joe 3239 Sep 30 12:40 mkdirhier.sh[/align]
[align=left]~/tmp $[/align]
[align=left] [/align]
[align=left]谨慎使用 xargs [/align]
[align=left]从技术上讲,使用 xargs 很少遇到麻烦。缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略。为了防止这种情况发生,可以使用 -e 标志,它在不带参数的情况下完全禁用结束字符[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: