如何在 bash 中将命令输出重定向到 vim?

fai*_*zal 106 vim bash vi

我正在尝试将 bash 命令的输出重定向到一个新文件中。

如果我尝试如下管道:

ls -la | vim
Run Code Online (Sandbox Code Playgroud)

Bash 向我展示了错误:

Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)

我知道我可以打开 Vim 然后使用:

:r !ls -la
Run Code Online (Sandbox Code Playgroud)

但是有没有办法在 bash 本身中做到这一点,以便打开 Vim 并将输出自动粘贴到那里?

cha*_*aos 168

您可以使用进程替换(这也适用于无法读取的应用程序STDIN):

vim <(ls -la)
Run Code Online (Sandbox Code Playgroud)

或者使用vim的函数读取STDIN

ls -la | vim -
Run Code Online (Sandbox Code Playgroud)

  • `&lt;(ls -la)` 实际上是 [进程替换](https://gnu.org/software/bash/manual/bash.html#Process-Substitution) 而不是 [命令替换](https://gnu. org/software/bash/manual/bash.html#Command-Substitution)。 (2认同)
  • 我真的很喜欢 vim 的选项,它允许我从数据转储中轻松搜索、查找和保存输出。 (2认同)

Cri*_*rph 45

你真的很亲近自己。你只是少了一个角色。

ls -la | vim -
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,它是两个字符。;) (14认同)

Ala*_*Ali 22

这是另一种方法,希望能教给某人一些新东西。

如果您知道该命令:r !ls -la在 vim 中有效,您可以执行以下操作来打开 vim 并使其在打开后立即运行该命令,直接从 bash:

vim -c ':r! ls -la'
Run Code Online (Sandbox Code Playgroud)

这相当于打开vim然后执行命令:r! ls -la。这应该适用于任何vim命令,其中命令在-c选项之后。


iff*_*ffy 12

你可以告诉 vim 打开标准输入:

ls -la | vim -
Run Code Online (Sandbox Code Playgroud)