Вызов vi через find | Xargs ломает мой терминал. Зачем?

При вызове vim через find | xargs find | xargs , вот так:

 find . -name "*.txt" | xargs vim 

Вы получаете предупреждение о

 Input is not from a terminal 

И терминал с довольно сильно сломанным поведением впоследствии. Почему это?

  • Vim и мышь с ssh от Mac до Linux
  • Как отключить вводный перевод для некоторых клавиш на экране GNU?
  • Как OSX должен работать без мыши?
  • Редактор txt-файлов для Windows с подсветкой синтаксиса и складными / разборными разделами для Markdown
  • Можно ли изменить значки на панели инструментов в gVim?
  • Проблема с VIM
  • Как я могу сохранить код, созданный как исходный источник, когда я вставляю их в vim?
  • Как я могу выбрать содержимое HTML-тегов в Vim?
  • 5 Solutions collect form web for “Вызов vi через find | Xargs ломает мой терминал. Зачем?”

    Когда вы вызываете программу через xargs , stdin (стандартный ввод) программы указывает на /dev/null . (Поскольку xargs не знает оригинальный stdin, он делает следующее лучшее.)

     $ True |  Xargs filan -s
         0 chrdev / dev / null
         1 tty / dev / pts / 1
         2 tty / dev / pts / 1
    
     $ True |  Xargs ls -l / dev / fd /
    

    Vim ожидает, что его stdin будет таким же, как и его управляющий терминал, и напрямую выполняет различные связанные с терминалом ioctl на stdin. Когда это делается в /dev/null (или любом дескрипторе файла не-tty), эти ioctls бессмысленны и возвращают ENOTTY, который бесшумно игнорируется.

    • Мое предположение по более конкретной причине: при запуске Vim читает и запоминает старые настройки терминала и восстанавливает их при выходе. В нашей ситуации, когда «старые настройки» запрашиваются для не-tty fd (дескриптор файла), Vim получает все значения пустым и все параметры отключены и небрежно устанавливает то же самое с вашим терминалом.

      Вы можете увидеть это, запустив vim < /dev/null , выйдя из него, а затем запустив stty , из которого выйдет много <undef> s. В Linux запуск stty sane снова сделает терминал пригодным для использования (хотя он потеряет такие опции, как iutf8 , что может привести к незначительным раздражениям позже).

    Вы можете считать это ошибкой в ​​Vim, поскольку она может открывать /dev/tty для управления терминалом, но это не так. (В какой-то момент во время запуска Vim дублирует свой stderr на stdin, что позволяет ему читать ваши команды ввода – от fd, открытого для записи, – но даже это не сделано достаточно рано.)

    Следуя от ответа xargs , xargs указывает stdin на /dev/null


    Из OSX / BSD man xargs

     -o Повторно открыть stdin как / dev / tty в дочернем процессе 
             Перед выполнением команды.  Это полезно 
             Если вы хотите, чтобы xargs запускал интерактивное приложение.
    

    Таким образом, для вас должна работать следующая строка кода:

      найти .  -name "* .txt" |  Xargs -o vim 

    Для GNU man xargs нет флага, но мы можем явно передать / dev / tty для решения проблемы:

      найти .  -name "* .txt" |  Xargs bash -c '</ dev / tty vim "$ @" "ignoreme 

    Ignoreme должен взять $ 0, так что $ @ – все аргументы от xargs

    Самый простой способ:

     vim $(find . -name "*foo*") 

    Он должен работать нормально, если вы используете опцию -exec для поиска, а не для подключения к xargs. Например

    $ find . -type f -name filename.txt -exec vi {} +

    Вместо этого используйте GNU Parallel:

     find . -name "*.txt" | parallel -j1 --tty vim 

    Или если вы хотите открыть все файлы за один раз:

     find . -name "*.txt" | parallel -Xj1 --tty vim 

    Он даже правильно обрабатывает имена файлов, такие как:

     My brother's 12" records.txt 

    Смотрите видеоролик, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

    Interesting Posts

    USB-накопитель внезапно стал доступен только для чтения

    Мой значок мыши запущен на моем компьютере

    Как отключить Защитник Windows навсегда

    Завиток не может соединяться; Wget может

    Как предотвратить автоматическое изменение состояния процессора до 100%?

    «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с использованием PHP

    Часы Windows XP установлены неправильно после возобновления сна

    Попытка добиться более высокой скорости передачи файлов в моей домашней сети

    Microsoft Outlook 2007 зависает

    Вызов функции модуля с использованием его имени (строки)

    Какие инструменты можно использовать для отслеживания изменений на веб-страницах?

    Каковы лучшие бесплатные (ware?) Параметры тестирования производительности ПК?

    FFMPEG разделяет MP4 с тем же качеством

    Есть ли firefox-подобный плагин-контейнер для хром?

    Как проверить слот RAM сломан

    Давайте будем гением компьютера.