`grep -l .. | xargs vim` 生成警告,为什么?

`grep -l .. | xargs vim` 生成警告,为什么?

如果我运行类似的命令

grep -rl test . | xargs vim

我收到警告“Vim:警告:输入不是来自终端。”但我仍然可以编辑文件。为什么会出现警告?

答案1

因为 Vim 是从内部调用的管道stdin连接到前一个管道的输出,而不是终端。作为一个交互式命令,Vim 需要从终端接收其输入。

最好避开管道,例如via

$ vim $(grep -rl test .)

或者从 Vim 内部:

:args `grep -rl test .`

答案2

Vim 需要其标准输入作为您输入命令的终端,但根据您的实现,它会获取/dev/null或 管道。grepxargs

您可以通过中间 shell 恢复标准输入。

grep -rl test . | xargs sh -c 'vim -- "$@" <$0' /dev/tty

如果文件名不包含任何空格字符或任何\[?*,您可以使用命令替换:

vim $(grep -rl test .)

处理特殊字符(换行符除外)的一种方法是将单词分割限制为换行符并关闭通配符。

(IFS='
'; set -f; exec vim $(grep -rl test .))

答案3

如果您使用 GNU Parallel 而不是 xargs,您不会收到警告,并且您的终端设置之后也不会更改:

grep -rl test . | parallel -X --tty vi

额外的好处:即使文件名包含空格、' 或 ",它也能工作。

相关内容