【发布时间】: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