Bash Shell输出作为输入

你希望从一个程序中获得输出,再将其作为另一个程序的输入。

解决方案

可以将第一个程序的输出重定向到一个临时文件,然后将该文件作为另一个程序的输入。例如:

$ cat one.file another.file > /tmp/cat.out
$ sort < /tmp/cat.out
...
$ rm /tmp/cat.out
$

也可以将这些操作合为一步,利用管道符号(|)将输出直接发送到下一个程序。例如:

cat one.file another.file | sort

还可以用多个管道将一系列命令连接在一起:

cat my* | tr 'a-z' 'A-Z' | sort | uniq | awk -f transform.awk | wc

讨论

使用管道符号意味着不用再创建临时文件,事后再将其删除。

像 sort 这种程序,既能从标准输入中获取输入(通过 < 符号进行重定向),也能从作为参数的文件中获取输入。因此,可以按以下方式操作:

sort /tmp/cat.out

不用再将输入重定向到 sort:

sort < /tmp/cat.out

这种行为(如果提供了文件名参数,就使用文件作为输入;否则,使用标准输入)是 Unix/Linux 的典型特征,也是一种应该遵循的实用模型,以便多个命令可以通过管道机制彼此相连。这种程序称为过滤器,如果照此方式编写程序和 shell 脚本,则更有助于你个人以及你的同事。

尽情感叹简洁有力的管道机制吧。你甚至可以将管道视为一种初级的并行处理机制。你可以让两个命令(程序)并行运行并共享数据:一个的输出作为另一个的输入。二者不必按顺序运行(一个结束,另一个接着开始),只要第一个命令产生可用数据,第二个命令立刻就可以开始处理。

但要注意,按照这种方式运行的多个命令(通过管道相连)分别在多个独立的进程中运行。尽管这一细微之处经常被忽视,有时所带来的影响却不容小视。

另外思考命令 svn -v log | less。如果 less 在 Subversion 结束数据发送前退出,就会出现错误svn: Write error: Broken pipe。尽管看起来不怎么美观,但也没什么坏处。通过管道将大量数据传给 less 等命令时,总会出现这种事:一旦发现了要找的东西,就会想要退出,哪怕是管道中还有更多数据。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!