在Linux shell中的I / Ostreamredirect。 shell如何通过redirect来处理命令?

目前我正在编写一个小的shell(redirect,pipe道,exec等)。 一直试图找出Linuxshell在处理I / Oredirect中所采取的步骤。

关于我需要帮助的一些问题:

  1. 在寻找redirect时,shell从命令行读取哪个方向? 从左到右还是相反? 使用recursion?

  2. 壳需要寻找什么情况? (不知道是否有很多或只是一对可以包含很多变化)

无论如何,我能想到的是(如果我错了,请纠正我):

cmd > file1 # stdout of cmd goes to file cmd file1 > file2 # stdout of cmd with file1 as an argument goes to file2 cmd file2 < file1 # stdin on file2 comes from file1 

现在我不知道以下情况下的过程(如shell查找和处理这些过程)。 壳所采取的步骤是不为人知的

 cmd file2 > file3 < file1 # using "tee" in place of "cmd" I don't know # how to do the dups and when to exec cmd file2 < file3 > file1 # same ^ 

只要你只重定向标准输入和标准输出,处理重定向的顺序并不重要,所以最后两个例子是完全一样的。

BASH从左向右处理IO重定向。

 > cmd1 > file 2>&1 > cmd2 2>&1 > file 

这两个是不同的。 在第一种情况下,我将stdout绑定到file ,然后将stderr绑定到stdout:stderr和stdout现在都进入该文件。

在第二种情况下,我将(孩子)stderr绑定到(父级)stdout,然后找到孩子的stdout文件。 结果是,你现在得到了标准输出的孩子的stderr输出和标准输出到文件。 例如,这对于处理管道中的标准错误很有用。

如果你看看BASH的源代码,你可以看到一个命令的执行分成几个步骤:

  • 替换所有变量
  • 将输入分割成“文字”
  • 处理IO重定向(并删除涉及的单词)
  • 使用正确的IO设置和其余的单词作为参数创建一个新的子进程。