我在重定向 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/