Коли ви викликаєте програму через 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
(або будь-якого нетипового дескриптора файлів) ці йоктли є безглуздими і повертають ENOTTY, що мовчки ігнорується.
Моя здогадка про більш конкретну причину: при запуску Vim зчитує та запам'ятовує старі настройки терміналу та відновлює їх назад під час виходу. У нашій ситуації, коли "старі налаштування" запитуються на не-tty fd (дескриптор файлу), Vim отримує всі значення порожні та всі параметри вимкнено, і недбало встановлює те саме на ваш термінал.
Ви можете побачити це, запустивши vim < /dev/null
, вийшовши з нього, потім запустивши stty
, що виведе цілу партію <undef>
s. У Linux, працює stty sane
зроблять термінал придатного для використання (хоча це буде втратило такі варіанти , як iutf8
, можливо , викликаючи незначні дратували пізніше).
Ви можете вважати цю помилку у Vim, оскільки вона може відкриватися /dev/tty
для управління терміналом, але ні. (У якийсь момент під час запуску Vim дублює свій stderr на stdin, що дозволяє йому читати ваші вхідні команди - з fd, відкритого для запису, - але навіть це не робиться досить рано.)
find
абоxargs
зовсім. Відкрийте vim без аргументів, а потім запустіть,:args **/*.txt<CR>
щоб встановити аргументи vim зсередини редактора.