gpt4 book ai didi

linux - Linux shell 中的 I/O 流重定向。 shell 如何处理带重定向的命令?

转载 作者:IT王子 更新时间:2023-10-29 01:15:21 24 4
gpt4 key购买 nike

目前我正在编写一个小型 shell(重定向、管道、exec 等)。一直在尝试找出 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

现在我不知道以下情况的过程(如 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 ^

最佳答案

只要您只重定向 stdin 和 stdout,处理重定向的顺序并不重要,所以最后两个示例完全相同。

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

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

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

在第二种情况下,我将( child 的)stderr 绑定(bind)到( parent 的)stdout,然后找到 child 的 stdout 进行归档。结果是您现在在 stdout 上获得 child 的 stderr 输出,并且 stdout 转到文件。例如,这对于在管道中处理 stderr 很有用。

如果查看 BASH 的源代码,您会发现一条命令的执行分为几个步骤:

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

关于linux - Linux shell 中的 I/O 流重定向。 shell 如何处理带重定向的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com