Em zle
widgets, parece que zsh
fecha stdin. Suponho que zsh
queira evitar comandos nesses widgets interferindo diretamente na entrada do usuário, mas seria mais sensato redirecionar o stdin de / dev / null ( que será corrigido na próxima versão ).
Quando stdin (descritor de arquivo 0) é fechado, isso significa que o primeiro arquivo que um comando abre se torna seu stdin (como os descritores de arquivo são alocados a partir do primeiro livre).
Em dircolors
, isso aciona um bug. dircolors
abre seu ~/.dircolors
e, em seguida, tenta torná-lo stdin sem perceber que já era stdin (porque esse é o fd open()
retorna). Portanto, o dup2(0,0)
(dup stdin em si mesmo) falha com um erro EBADF que dircolors
reporta.
stty
define as configurações do terminal aberto em seu stdin. Aqui, stdin é fechado, então stty
retorna com um erro.
Aqui, você pode alterar seu widget para restaurar o stdin no terminal:
reread_zshrc () . ~/.zshrc < $TTY
Mas note que alterar as configurações do tty a partir de um widget zle
(embora eu não saiba o que seu comando stty
faz) é uma má ideia pois zle
define o tty em um modo especial para edição de linha com o qual você não quer se atrapalhar (e no final da edição, as configurações normais do tty serão restauradas de qualquer maneira, então as alterações que você está fazendo serão perdidas).
Então, talvez você devesse fazer stdin /dev/null
(como você não quer fazer coisas com o terminal lá), mas stty
ainda reclama (como /dev/null
não é um dispositivo tty), então você também pode querer redirecionar o stderr para o / dev / null para ocultar essas mensagens de erro (embora ele possa ocultar as mensagens de erro all ):
reread_zshrc() . ~/.zshrc < /dev/null 2> /dev/null