Linux外壳中的I/O流重定向.shell如何处理带有重定向的命令



目前我正在编写一个小型shell(重定向、管道、exec等)。我一直在试图弄清楚Linux shell在解决I/O重定向问题上所采取的步骤。

关于我需要帮助的问题:

  1. shell在寻找重定向时从命令行读取的方向是什么?从左到右还是相反?使用递归?

  2. shell需要查找哪些案例?(不确定是有很多还是只有几个可以包含很多变化)

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

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 ^

只要只重定向stdin和stdout,处理重定向的顺序就无关紧要,所以最后两个示例完全相同。

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

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

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

在第二种情况下,我将(子级的)stderr绑定到(父级的)标准输出,然后找到子级的标准输出到文件。结果是,您现在可以在stdout上获得子级的stderr输出,并且stdout将转到该文件。例如,这对于处理管道中的stderr非常有用。

如果您查看BASH的源代码,您可以看到命令的执行分为几个步骤:

  • 替换所有变量
  • 将输入拆分为"单词"
  • 处理IO重定向(并删除相关单词)
  • 使用正确的IO设置和剩余的单词作为参数创建一个新的子进程

最新更新