Linux shell中的I / O流重定向。 shell如何使用重定向处理命令?

时间:2013-11-26 11:08:16

标签: linux bash io-redirection dup

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

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

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

  2. shell需要查找的案例是什么? (不确定是否有很多或只有一对可以包含很多变化)

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

    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查找和处理这些情况)。 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 ^
    

1 个答案:

答案 0 :(得分:4)

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

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

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

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

在第二种情况下,我将(孩子的)stderr绑定到stdout(父节点),然后我找到孩子的stdout来存档。结果是你现在在stdout上得到了孩子的stderr输出,stdout转到了文件。例如,这对于处理管道中的stderr非常有用。

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

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