【问题标题】:Does shell communicates with "ls" using pipes?shell 是否使用管道与“ls”通信?
【发布时间】:2013-11-09 13:10:40
【问题描述】:

我的理解

当我在某个 shell (bash/ksh/csh/sh/whatsoever_shell) 中输入命令 ls *.txt 时,

1) shell 首先扩展通配符表达式*.txt(例如a.txt、b.txt、c.txt)
2) 然后fork()s 一个子进程
3) 使用扩展表达式作为命令行参数

调用exec()(或其变体)

我的理解正确吗?或者这是否以涉及管道的其他方式发生?

【问题讨论】:

  • 是的,没错。您可以使用strace 来计算更多信息(尤其是在execve 之后会发生什么)。
  • shell 不使用管道,除非您使用单个 | 来指示它们的用途。 ls 命令是一个数据生成器;它不读取其标准输入;它只使用它的参数列表。它写入其标准输出,这与 shell 的标准输出相同,除非您执行 I/O 重定向或将数据通过管道传输到另一个进程。

标签: linux shell exec fork pipe


【解决方案1】:

你的理解是正确的。无需使用管道,因为子进程可以共享 shell 的标准 I/O 文件描述符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2013-01-22
    相关资源
    最近更新 更多