Quando você chama um programa via xargs
, o stdin do programa (entrada padrão) aponta para /dev/null
. (Como o xargs não conhece o stdin original , ele faz a próxima melhor coisa.)
$ true | xargs filan -s 0 chrdev /dev/null 1 tty /dev/pts/1 2 tty /dev/pts/1 $ true | xargs ls -l /dev/fd/
O Vim espera que seu stdin seja o mesmo que seu terminal de controle, e executa vários ioctl relacionados ao terminal está em stdin diretamente. Quando feito em /dev/null
(ou qualquer outro descritor de arquivo não-tty), essas ioctls são insignificantes e retornam ENOTTY, que é ignorado silenciosamente.
-
Meu palpite em uma causa mais específica: Na inicialização, o Vim lê e lembra as configurações antigas do terminal e restaura-as novamente ao sair. Em nossa situação, quando as "configurações antigas" são solicitadas para um não-tty fd (descritor de arquivo), o Vim recebe todos os valores vazios e todas as opções desabilitadas, e descuidadamente define o mesmo para o seu terminal.
Você pode ver isso executando
vim < /dev/null
, saindo dele e executandostty
, que produzirá um lote inteiro de<undef>
s. No Linux, executarstty sane
tornará o terminal utilizável novamente (embora tenha perdido opções comoiutf8
, possivelmente causando pequenos aborrecimentos mais tarde).
Você poderia considerar isso um bug no Vim, já que pode abrir /dev/tty
para controle de terminal, mas não. (Em algum momento durante a inicialização, o Vim duplica seu stderr para stdin, o que permite que ele leia seus comandos de entrada - de um fd aberto para gravação - mas mesmo isso não é feito cedo o suficiente.)