为什么当我返回 shell 时,通过管道将文件名输入 VIM 会破坏 bash?

为什么当我返回 shell 时,通过管道将文件名输入 VIM 会破坏 bash?

我使用 find 搜索了一些文件,并且想在 Vim 的选项卡中打开所有文件。所以我尝试了这个:

find . | xargs fgrep -l myExpression | xargs vim -p

这很有效,除了当我完成并退出 Vim 时,我在 vim 中输入的所有内容都是不可见的,并且退格键不起作用(所以当我输入ls<backspace><backspace>exit结果历史记录时,它ls^?^?exit不是exit。它还警告我,我的管道不是从终端。

不过,当我重新启动 shell 时,一切都恢复正常了。这总是可重现的。

重击版本:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Vim 版本:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699

答案1

命令行程序可以通过两个来源获取用户的输入:来自 stdin(您正在通过管道传输到的),以及直接连接到 TTY。当这些混合在一起时,就会发生不好的事情。 Vim 不想从管道读取输入,它需要你(用户)直接读取输入。所以让我们把真正的标准输入返回给它。

作为解决方案,我们可以使用命令替换直接将文件作为参数传递给 Vim:

vim -p $(find . | xargs fgrep -l myExpression)

请注意,由于 shell 执行的扩展,这将不是正确处理名称中带有空格的文件,但我的 Bash-fu 太弱,无法找到简单的修复方法。

另外,find options | xargs some command可以写成find options -exec some command {} +,这可能会被认为更优雅。

相关内容