重定向标准输出和错误时,附加作品不带>>

用户名

我有一个文件test.txt,没有名为的文件test当我尝试

ls test test.txt > new 2>new

new由于>>没有使用,我期望被覆盖但是在输出文件中,我同时添加了两个内容。为什么会这样呢?

约翰·史密斯

TL; DR bash将打开并截断所有涉及的文件,然后再将任何内容写入其中。stdout并且stderr都被发送到,new因为开始打印bash时已经将文件截断了两次ls

这就是bash准备/处理I / O重定向的方式。当您要求将命令重定向(>)到文件时,bash基本上会打开该文件,并在必要时创建它。如果该文件已经存在,它将被截断。open在您的情况下,这是通过系统调用和一些标志来完成的:

open("new", O_WRONLY|O_CREAT|O_TRUNC, 0666)

O_CREAT如果文件不存在,则创建该文件;如果文件不存在,则将其O_TRUNC截断。open系统调用是bash的初始化的一部分,这意味着当您使用多个重定向操作时(例如在...中)

$ ls test test.txt > new 2>new

...bash首先打开所有相关文件。因此,在运行之前ls,它将打开new两次,并带有相同的标志:

open("new", O_WRONLY|O_CREAT|O_TRUNC, 0666)
open("new", O_WRONLY|O_CREAT|O_TRUNC, 0666)

这意味着基本上,在运行命令时,bash将按以下顺序执行以下操作:

  1. 打开new为标准输出,必要时创建/截断文件。
  2. new以标准错误打开,请在必要时创建/截断文件。
  3. 运行ls:这会将内容写入new

如您所见,启动之前会bash截断所有涉及的文件这意味着,使用时基本上将其“截断”两次,然后将输出重定向到该对象。您期望的行为将需要独立捕获的stdout和stderr,并在编写之前将它们一个接一个地打开。基本上:ls... >new 2>newnewbashls

  1. 开始ls
  2. 当出现某种情况时stdout,请打开new,截断并写入。
  3. 当出现问题时stderrnew再次打开,截断并写入。

但是,消息可能会交织在一起:重定向的程序很可能会先向写入内容stdout,然后再向写入其他内容,然后stderr再返回stdout...管理所有这些内容是可怕的(这可能会导致不良后果(未定义?)。行为...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重定向标准错误并保留标准输出

来自分类Dev

重定向标准输入和标准输出

来自分类Dev

重定向标准输入和标准输出?

来自分类Dev

将错误重定向到标准输出

来自分类Dev

PowerShell标准输出和重定向

来自分类Dev

haskell System.Process.createProcess重定向标准输出和标准错误

来自分类Dev

重定向标准输出和标准错误,以及发送到后台的别名

来自分类Dev

如何使用变体重定向标准输出和标准错误?

来自分类Dev

zsh:重置标准输出/标准错误重定向

来自分类Dev

如何将标准输出重定向到标准错误

来自分类Dev

重定向标准输出和标准输入-Java

来自分类Dev

在 bash 脚本中重定向标准输入和标准输出

来自分类Dev

错误时Ajax重定向

来自分类Dev

将STDOUT和STDERR重定向到文件,但system()的标准输出/错误除外

来自分类Dev

重定向标准输出OCaml

来自分类Dev

重定向EOF的标准输出

来自分类Dev

如何正确重定向标准输出以不带注释地将文件传递给pacman输入

来自分类Dev

如何正确重定向标准输出以不带注释地将文件传递给pacman输入

来自分类Dev

脚本写入标准输出和标准错误时如何防止Cron电子邮件

来自分类Dev

将标准输出重定向到文件

来自分类Dev

将标准输出重定向到整数

来自分类Dev

Python撤销标准输出重定向

来自分类Dev

使用find -exec重定向标准输出

来自分类Dev

LLDB重定向下级标准输出

来自分类Dev

在屏幕命令中重定向标准输出

来自分类Dev

在Unix上重定向标准输出

来自分类Dev

如何从右向左重定向标准输出

来自分类Dev

在 VBS 中重定向到标准输出

来自分类Dev

输入和输出重定向