`grep -l .. | xargs vim` генерирует предупреждение, почему?

Если я запускаю команду как

grep -rl test . | xargs vim 

Я получаю предупреждение «Vim: Предупреждение: вход не из терминала». Но я все еще могу редактировать файлы. Почему предупреждение?

3 Solutions collect form web for “`grep -l .. | xargs vim` генерирует предупреждение, почему?”

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

Лучше избегать трубы, например, через

 $ vim $(grep -rl test .) 

или изнутри Vim:

 :args `grep -rl test .` 

Vim нуждается в стандартном вводе, чтобы быть терминалом, на котором вы будете вводить команды, но он получает либо /dev/null либо pipe из grep зависимости от вашей реализации xargs .

Вы можете восстановить стандартный ввод через промежуточную оболочку.

 grep -rl test . | xargs sh -c 'vim -- "$@" <$0' /dev/tty 

Если имена файлов не содержат какого-либо символа пробела или любого из \[?* , Вы можете вместо этого использовать подстановку команд:

 vim $(grep -rl test .) 

Один из способов справиться со специальными символами (кроме новой строки) заключается в том, чтобы ограничить разделение слов на символы новой строки и отключить глобусы.

 (IFS=' '; set -f; exec vim $(grep -rl test .)) 

Если вы используете GNU Parallel вместо xargs, вы не получите предупреждение, и после этого настройки вашего терминала не будут изменены:

 grep -rl test . | parallel -X --tty vi 

Добавленный бонус: он работает, даже если имена файлов содержат пробел, «или».

  • Преобразование строк новой строки в нуль-ограничение при использовании хвоста
  • Как процитировать аргументы с помощью xargs
  • отобразить результаты поиска
  • Каков синтаксис для передачи вывода команды в xargs?
  • Почему «find / -name» * .txt '| cp / junk "не работает?
  • человек xargs говорит, что стандартный ввод ограничивается пробелами; но так ли?
  • Передача параметров mulitiple через xargs
  • используйте find и grep, чтобы найти строки, содержащие некоторую строку и не содержащие другую строку из файлов
  • Прикрепление файла в Unix для данной строки, а затем другой набор строк в этом файле и печать свойств файла тоже
  • Невозможно запросить пользователя с помощью опции rm bultin prompt -i с помощью xargs и найти
  • Неверное поведение xargs
  • Interesting Posts

    Обновление Slackware Upgrade на новой версии

    `openssl`: Альтернативное имя субъекта

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

    Как создать защищенный паролем сценарий оболочки

    Преимущества использования именованных каналов и сокетов, а не временных файлов

    Когда требуется перезагрузка?

    отключить поддержку мыши в `vim` в среде« gnome-terminal »

    Как и где метаданные файловой системы кэшируются в Linux

    изменить файл с помощью awk или sed

    Как настроить XFCE (или сам X или любой другой) для запуска пользовательской команды, когда пользователь некоторое время простаивает?

    Застрял установку TexLive с нуля на Debian KDE!

    Как изменить разрешение одного экрана, чтобы использовать только его часть?

    Procmail распознает электронные письма, которые уже были скопированы в папку

    Уменьшение физического объема LVM на вершине mdadm деградировало массив RAID, добавив запасную и восстановив его

    Вывод одной команды передается на другой; как закрыть оба?

    Linux и Unix - лучшая ОС в мире.