Grep — Почему Передача Имен Файлов В Vim Нарушает Работу Bash, Когда Я Возвращаюсь В Оболочку?

  • Автор темы YASTA SOB
  • Обновлено
  • 20, Oct 2024
  • #1

Я нашел несколько файлов с помощью find и хотел открыть их все на вкладках в Vim. Итак, я попробовал это:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699

Это работало отлично, за исключением того, что когда я закончил и вышел из Vim, все, что я вводил в vim, было невидимым, а возврат назад не работал (поэтому, когда я набирал типа

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
the resulting history was
exit
и не
ls^?^?exit
. It also gave me a warning that my piping was not from a terminal.

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

Баш-версия:

ls<backspace><backspace>exit

Вим-версия:

find . | xargs fgrep -l myExpression | xargs vim -p

#bash #grep #find #vim #xargs

YASTA SOB


Рег
24 Oct, 2020

Тем
79

Постов
190

Баллов
645
  • 25, Oct 2024
  • #2

Программа командной строки может получать входные данные от пользователя из двух источников: из стандартного ввода (к которому вы передаете данные по конвейеру) и путем подключения непосредственно к TTY. Плохие вещи могут случиться, когда они перепутаны. Vim не хочет читать входные данные из канала, он хочет напрямую вас, пользователя. Итак, давайте вернем ему настоящий стандартный ввод.

В качестве решения мы можем использовать замена команды чтобы напрямую передать файлы в качестве аргументов Vim:

find options -exec some command {} +

Обратите внимание, что из-за расширений, выполняемых оболочкой, это будет нет правильно обрабатывать файлы с пробелами в именах, но мой Bash-фу слишком слаб, чтобы знать простое решение.

Также,

find options | xargs some command
can be written as
vim -p $(find . | xargs fgrep -l myExpression)
, что можно было бы считать более элегантным.

 

Vladdva


Рег
05 Apr, 2008

Тем
67

Постов
213

Баллов
578
Тем
403,760
Комментарии
400,028
Опыт
2,418,908