bash - 重定向的意外输出

标签 bash vim io-redirection

我在重定向 STDOUT 和 STDERR 时遇到了一个奇怪的问题。以下按预期工作:

$ gvim --version > /tmp/version.out
$ ls -l /tmp/version.out
-rw-r--r--. 1 blah blah 3419 Jun 27 17:28 /tmp/version.out

输出文件中有 3419 个字符,当我查看该文件时,它包含我期望的内容。

但是,当我执行以下操作时,它并没有按预期工作:

$ gvim --version > /tmp/version.out 2> /tmp/version.err
$ ls -latr /tmp/version.*
-rw-r--r--. 1 blah blah 0 Jun 27 17:29 /tmp/version.out
-rw-r--r--. 1 blah blah 0 Jun 27 17:29 /tmp/version.err

请注意,这次 .out 和 .err 文件的长度均为零。我用 ls 命令尝试了这个,它按预期工作:

$ ls . /ZZZ > /tmp/ls.out 2> /tmp/ls.err
$ ls -l /tmp/ls.*
-rw-r--r--. 1 blah blah 50 Jun 27 17:45 /tmp/ls.err
-rw-r--r--. 1 blah blah 33 Jun 27 17:45 /tmp/ls.out

此处,STDERR 被正确重定向:

$ cat /tmp/ls.err
ls: cannot access /ZZZ: No such file or directory

我在 gvim --version 上做了一个 strace 并确认它正在尝试将版本信息写入 STDOUT (fd 1)。不过这两种方式都不重要,因为我正在尝试同时捕获 STDOUT 和 STDERR。

这是怎么回事?

最佳答案

恭喜,您刚刚在 gvim 中发现了一个错误! 正确的程序是file a new issue on GitHub .

您应该先尝试该错误的其他变体,以便开发人员更容易调试。

例如,仅重定向 STDERR 也会导致错误,因为没有写入输出。也有返回成功(0),这显然是一个错误。

$ gvim --version 2> /tmp/version.err
$ echo $?
0

仅通过查看代码,人们可能会在 version printing 中的某处搜索错误。 ,或通用 --version 参数处理中的任何地方,not being done by gtk .

回答你的问题

这是怎么回事?

这是一个程序错误,由 gvim 的开发人员造成,我不建议您努力寻找其根本原因,除非您有编写代码的经验 vim 或者如果你想学习 vim 是如何工作的。在这种情况下,您最好的选择是 fork the repo并在修复后提交拉取请求,以便每个人都能从您的工作中受益。

关于bash - 重定向的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792063/

相关文章:

bash - MSYS2 和 Cygwin 的区别

excel - 通过命令行使用 LibreOffice 将 .xls 转换为 .pdf

vim - 如何卸载Janus?

bash - 监控和/etc/环境

linux - 如何在shell脚本中收集变量中的多行

mysql - 具有 crm 功能的命令行邮件客户端

Vim:删除可视选定区域内的空行

python - 将 sys.stdout 重定向到特定的 Jupyter Notebook 单元格

php - 如何将调用程序的输出重定向到文件?

linux - 解释这个 bash 重定向行为