当我们调用任何shell命令时,内部发生了什么

时间:2013-07-24 11:09:20

标签: c shell

当我们调用任何shell命令时,任何人都可以帮助我在内部理解代码/步骤流。例如,假设我在bourne shell上运行了以下内容:

ls  -l | grep -r "string"

内部发生的函数调用是什么?

据我所知,它将在内部调用一些execv族函数。但是,任何人都可以告诉我它将进行的其他函数调用是什么以及它的序列是什么?

2 个答案:

答案 0 :(得分:11)

您可以自己了解使用strace实用程序会发生什么。运行它:

strace sh -c 'ls  -l | grep -r "string"'

这将运行一个shell,而shell将依次运行您的命令,最后strace将打印出系统调用后幕后发生的事情。

答案 1 :(得分:3)

简而言之:

  1. 解析和词法分析
  2. 扩张
    1. 支撑扩张
    2. tidle expansin
    3. 变量扩展
    4. 算术和其他子行为
    5. 分词
    6. 文件名生成/扩展
  3. 执行
    1. bash fork本身(每个命令一次)
    2. 将SIGINT处理程序恢复为默认值
    3. 打开命令之间的管道(dup stdin,stdout)
    4. 关闭原始stdin / stdout
    5. 使用命令执行每个孩子
    6. parent bash等待......
  4. 也许其他人会添加更精确的“步骤”......