如果我运行类似的命令
grep -rl test . | xargs vim
我收到警告“Vim:警告:输入不是来自终端。”但我仍然可以编辑文件。为什么会出现警告?
答案1
因为 Vim 是从内部调用的管道,stdin
连接到前一个管道的输出,而不是终端。作为一个交互式命令,Vim 需要从终端接收其输入。
最好避开管道,例如via
$ vim $(grep -rl test .)
或者从 Vim 内部:
:args `grep -rl test .`
答案2
Vim 需要其标准输入作为您输入命令的终端,但根据您的实现,它会获取/dev/null
或 管道。grep
xargs
您可以通过中间 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
额外的好处:即使文件名包含空格、' 或 ",它也能工作。