4

目前我正在编写一个小外壳(重定向、管道、执行等)。一直试图弄清楚 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

现在我不知道以下情况的过程(如外壳如何查找和处理这些)。我不知道外壳采取的步骤

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 ^
4

1 回答 1

5

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

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

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

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

在第二种情况下,我将(孩子的)标准错误绑定到(父母的)标准输出,然后我找到孩子的标准输出文件。结果是您现在在标准输出上获得了孩子的标准错误输出,标准输出进入文件。例如,这对于处理管道中的 stderr 很有用。

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

  • 替换所有变量
  • 将输入拆分为“单词”
  • 处理 IO 重定向(并删除涉及的单词)
  • 使用正确的 IO 设置和剩余的单词作为参数创建一个新的子进程。
于 2013-11-26T11:17:52.713 回答