目前我正在编写一个小的shell(redirect,pipe道,exec等)。 一直试图找出Linuxshell在处理I / Oredirect中所采取的步骤。
关于我需要帮助的一些问题:
在寻找redirect时,shell从命令行读取哪个方向? 从左到右还是相反? 使用recursion?
壳需要寻找什么情况? (不知道是否有很多或只是一对可以包含很多变化)
无论如何,我能想到的是(如果我错了,请纠正我):
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的源代码,你可以看到一个命令的执行分成几个步骤: