Лучший способ прочитать вывод команды оболочки - PullRequest
9 голосов
/ 05 февраля 2012

В Vim, Каков наилучший (портативный и быстрый) способ чтения выходных данных команды оболочки? Эти выходные данные могут быть двоичными и, следовательно, содержать нули и (не) иметь завершающий символ новой строки, который имеет значение. Текущие решения, которые я вижу:

  1. Используйте system(). Проблемы: не работает с NULL.
  2. Используйте :read !. Проблемы: не сохранит завершающий символ новой строки, старается быть умным, обнаруживая формат вывода (dos / unix / mac).
  3. Используйте ! с перенаправлением во временный файл, затем readfile(, "b"), чтобы прочитать его. Проблемы: два вызова для fs, опция shellredir также перенаправляет stderr по умолчанию, и он должен быть менее переносимым (здесь упоминается 'shellredir', потому что он, вероятно, будет иметь допустимое значение).
  4. Используйте system() и фильтруйте выходы через xxd. Проблемы: очень медленные, наименее переносимые (без эквивалента 'shellredir' для труб).

Есть еще идеи?

1 Ответ

5 голосов
/ 06 февраля 2012

Вы используете текстовый редактор.Если вам небезразличны NUL, конечные EOL и (возможно) конфликтующие кодировки, вам все равно нужно использовать шестнадцатеричный редактор?

Если мне нужен такой уровень контроля над моими операциями, я действительно использую маршрут xxd с

:se binary

Одна хорошая опция, которую вы, похоже, пропускаете, - это режим вставки регистр выражений вставка:

Cr =system('ls -l') Ввод

Это может быть или не быть умнее / менее навязчивокодирование символов, но вы можете попробовать его, если это достаточно важно для вас.

Или вы можете использовать поддержку Perl или Python для эффективного использования popen

Грубая идея:

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