Já viu a mensagem “the input device is not a TTY” ?

Beatriz Menezes
stonetech
Published in
2 min readJun 27, 2022

Talvez você já tenha se deparado, ou esteja passando agora pelo seguinte erro ao tentar executar um comando em sua pipeline:

the input device is not a TTY

Mas o que significa isso?

De forma bem simples, podemos dizer que TTY é um sinônimo de terminal, ou seja, um ambiente com entrada e saída de texto (e até mesmo outra interações como movimentar o cursor), de forma que o usuário consiga interagir com a máquina.

Sabendo disso fica fácil interpretar o erro! Ele está simplesmente reclamando que estamos tentando interagir com uma interface que não é um TTY, isto porque, provavelmente, a pipeline em que o comando está sendo executado não possui uma interface interativa alocada por padrão.

Por que isso acontece?

Provavelmente o comando executado está configurado como interativo, o exemplo mais comum disso é a flag -it ou -ti, comumente utilizada em comandos docker:

docker exec -it containername
docker run --rm -ti ubuntu:16.04

Sendo que, a flag -i por si só entra no modo interativo, mesmo sem necessariamente ter um console. Já a tag -t aloca um pseudo TTY! Opa, exatamente o que precisamos, não é? Vamos ver melhor isso abaixo…

Soluções

Para solucionar o problema basta remover a tag -it, simples assim… 😄

Também podemos utilizar apenas a opção -t no comando, que como vimos acima, aloca um pseudo TTY, porém isso não é necessário, pois o docker já faz isso debaixo dos panos pra gente.

⚠️ IMPORTANTE: o -t é uma opção válida apenas para comandos docker, se você estiver utilizando um comando docker-compose vai precisar utilizar o -T (maiúsculo): docker-compose exec -T mysql

Mas pera aí né, essa é a forma elegante e recomendada, mas como se sabe nem sempre a vida real é favorável para seguir as recomendações, por isso se não for possível editar o comando e ele tiver que ser executado com a flag interativa mesmo podemos tentar a seguinte g̶a̶m̶b̶i̶a̶r̶r̶a solução paliativa:

Nesse exemplo estava utilizando o GitHub Actions para executar minha pipeline; então adicionei o seguinte script: shell: ‘script -q -e -c “bash {0}”’ antes de executar o comando docker que eu queria em si, essa linha realiza um reload com o shell bash forçando um pseudo TTY por cima da interatividade do docker, na prática ficou assim:

Se você chegou até aqui, espero ter te ajudado de alguma forma! Ficou com alguma dúvida ou tem algo à acrescentar? comenta aí! Até outra hora!

--

--