目前我正在编写一个小型shell(重定向、管道、exec等)。我一直在试图弄清楚Linux shell在解决I/O重定向问题上所采取的步骤。
关于我需要帮助的问题:
-
shell在寻找重定向时从命令行读取的方向是什么?从左到右还是相反?使用递归?
-
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设置和剩余的单词作为参数创建一个新的子进程