读取 shell 命令输出的最佳方法

发布于 2025-01-02 14:02:49 字数 531 浏览 1 评论 0原文

在 Vim 中,读取 shell 命令输出的最佳(便携且快速)方法是什么?该输出可能是二进制的,因此包含空值并且(不)具有重要的尾随换行符。我看到的当前解决方案:

  1. 使用system()。问题:不适用于 NULL。
  2. 使用 :read !。问题:不会保存尾随换行符,尝试智能检测输出格式(dos/unix/mac)。
  3. 使用 ! 重定向到临时文件,然后使用 readfile(, "b") 读取它。问题:两次调用 fs,shellredir 选项默认也会重定向 stderr,并且它应该不太可移植(这里提到 'shellredir' 是因为它很可能被设置为有效值)。
  4. 使用 system() 并通过 xxd 过滤输出。问题:非常慢,可移植性差(没有相当于管道的 'shellredir')。

还有其他想法吗?

In Vim, What is the best (portable and fast) way to read output of a shell command? This output may be binary and thus contain nulls and (not) have trailing newline which matters. Current solutions I see:

  1. Use system(). Problems: does not work with NULLs.
  2. Use :read !. Problems: won’t save trailing newline, tries to be smart detecting output format (dos/unix/mac).
  3. Use ! with redirection to temporary file, then readfile(, "b") to read it. Problems: two calls for fs, shellredir option also redirects stderr by default and it should be less portable ('shellredir' is mentioned here because it is likely to be set to a valid value).
  4. Use system() and filter outputs through xxd. Problems: very slow, least portable (no equivalent of 'shellredir' for pipes).

Any other ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟─花易冷 2025-01-09 14:02:49

您正在使用文本编辑器。如果您关心 NUL、尾随 EOL 和(可能)冲突的编码,那么您仍然需要使用十六进制编辑器吗?

如果我需要对操作进行如此多的控制,我确实会使用 xxd 路由,但

:se binary

您似乎错过了一个不错的选择,那就是插入模式表达式寄存器插入:

Cr=system('ls -l')输入

这可能会或可能不会对字符编码业务更智能/更少侵入,但您可以如果它对您来说足够重要,请尝试一下。

或者您可以使用 Perl 或 Python 支持来有效地使用 popen

大致想法:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines)

You are using a text editor. If you care about NULs, trailing EOLs and (possibly) conflicting encodings, you need to use a hex editor anyway?

If I need this amount of control of my operations, I use the xxd route indeed, with

:se binary

One nice option you seem to miss is insert mode expression register insertion:

C-r=system('ls -l')Enter

This may or may not be smarter/less intrusive about character encoding business, but you could try it if it is important enough for you.

Or you could use Perl or Python support to effectively use popen

Rough idea:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文