目前我正在编写一个小 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,然后找到要归档的子级的 stdout。结果是,您现在在 stdout 上获得子级的 stderr 输出,并且 stdout 转到文件。例如,这对于处理管道中的 stderr 很有用。
如果你查看 BASH 的源代码,你会发现命令的执行分为几个步骤:
- 替换所有变量
- 将输入拆分为“单词”
- 处理IO重定向(并去掉涉及的词)
- 使用正确的 IO 设置和剩余的单词作为参数创建一个新的子进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)