首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux shell中的I/O流重定向。shell如何处理重定向命令?

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

Stack Overflow用户
提问于 2013-11-26 11:08:15
回答 1查看 1.3K关注 0票数 4

目前,我正在编写一个小shell (重定向、管道、exec等)。一直在试图找出Linux shell在寻址I/O重定向时所采取的步骤。

关于我需要什么帮助的一些问题:

  1. 当shell正在寻找重定向时,它从命令行读取的是哪个方向?从左到右还是相反?使用递归?
  2. 外壳需要寻找哪些案例?(不确定是否有许多或仅仅一对可以包含大量变化的夫妇)

无论如何,我能想到的是(如果我错了就纠正我):

代码语言:javascript
复制
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如何查找和处理这些情况)。我不知道贝壳的脚步

代码语言:javascript
复制
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 ^
EN

回答 1

Stack Overflow用户

发布于 2013-11-26 11:17:52

只要您只重定向stdin和stdout,处理重定向的顺序就无关紧要,因此最后两个示例完全相同。

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

代码语言:javascript
复制
> cmd1 > file 2>&1
> cmd2 2>&1 > file

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

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

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

  • 替换所有变量
  • 将输入拆分成“单词”
  • 进程IO重定向(并删除所涉及的单词)
  • 使用正确的IO设置和剩下的单词作为参数创建一个新的子进程。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20215401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档