常规管道重定向的文件描述符的优缺点?

时间:2012-01-18 00:51:14

标签: bash shell unix

文件描述符与常规管道重定向相比有哪些优缺点(例如ls | wc)?

为什么更喜欢文件描述符stdin 0,stdout 1,stderr 2等? 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

管道,特别是匿名管道,如您的问题所示,(|)允许您直接在两个程序(或更多,在链中)之间传递数据,而无需在磁盘上安装任何中间文件。不必处理创建和删除此类临时文件的方便,并且可以更快,因为不必将文件写入磁盘,因为磁盘I / O相对较慢。

使用不同的文件描述符(特别是stdoutstderr,分别为1和2),允许您处理从程序到stdoutstderr的流一些文件。只有使用stderr的程序才能真正选择文件描述符,否则只需重定向到stdout(>1>)即可。

使用stderr 管道的一个人为举例如下:

# ./some-program 2> errors
# cat errors | wc -l

这会将stderrsome-program打印到文件errors,然后将cat errors的输出传输到wc -l,这是一个数字errors中的行数。 请注意,您绝不想以这种方式使用wc,而只能wc -l errors。这只是为了说明。

答案 1 :(得分:2)

从一个进程到另一个进程的管道输入涉及文件描述符;第一个过程的标准输出(fd = 1)连接到管道中下一个过程的标准输入(fd = 0)。

使用管道的替代方法是临时文件:

ls > tmp.1
wc < tmp.1
rm -f tmp.1

管道相对于此的优势是多方面的,但包括:

  • 没有临时文件可以留下来。
  • 在中断等情况下,无需尝试清除临时文件的代码
  • 这些流程可以并行工作(在多核机器上尤其有利)。
  • 无需创建文件名。
  • 少打字。

将文件描述符0,1,2变为标准输入,输出和错误的决定非常有价值。数字到流的映射是任意的,但只要每个人都同意,就完全有效。