`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 

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

  • Как удалить все, кроме последних 10 файлов
  • Xargs для извлечения имени файла
  • grep для файлов и открыть итоговые совпадения
  • Сортировка вывода «find»?
  • копирование подкаталогов, не содержащих определенный файл, в другой каталог
  • Почему эта труба не заканчивается, когда процесс las умирает (зомби)?
  • Использовать xargs вместо псевдонимов
  • xargs и линейный трубопровод
  • рекурсивно chmod
  • Grep каталог и возвращаемый список с номерами строк
  • Как получить код выхода параллельного процесса, запущенного xargs?
  • Interesting Posts

    Линии и символы вместо букв ElementaryOS

    rtlwifi / rtl8723befw.bin – Беспроводная остановка работает, тогда ноутбук должен перезагрузиться, чтобы получить беспроводную обратную связь

    Почему я не могу удалить эти элементы массива в jq?

    Термопринтер печатает только после отправки второго вывода данных на порт tty

    Может ли пользовательский языковой стандарт жить под ~ /?

    Печать диапазона разделенных запятыми столбцов, а остальное без разделения запятой

    Правильный синтаксис для операторов `if … elif`

    В чем разница между использованием; и выполнение скрипта

    Требуется новый «X» рабочий стол для VNC?

    Устранение неполадок `$ wget -A.pdf -r site.com`

    SCP между двумя разными серверами с двумя разными портами

    Как сделать scp уважением umask

    Правильная процедура подготовки перед основным обновлением системы

    Почему rsyslogd не соблюдает следующие строки в rsyslog.d

    Имя Func как переменная в цикле

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