O que você está perguntando não é realmente uma API gráfica, são apenas caracteres de controle de terminal.
Há muita história por trás disso, mas os terminais de volta no dia eram máquinas Teletipo . Basicamente uma máquina de escrever com papel de trilha conectado ao computador com uma conexão serial. Digitar um caractere enviaria esse valor binário para o computador (assim como o digitaria na página). O computador imprimiria os caracteres de volta como a saída do que você solicitou.
Caracteres especiais foram usados para controlar o terminal (que é onde a chave de controle vem, foi para produzir esses caracteres). Por exemplo, ^H
ou ^?
seria um retrocesso, ^M
é um retorno de carro (move o cursor para o início da linha) e ^J
é um avanço de linha (mova a página uma linha). Alguns códigos de controle possuem uma seqüência de escape em C (que é compartilhada por quase todas as linguagens de programação) para gerar os caracteres de controle. Os controles listados anteriormente seriam \b
, \r
, \n
, respectivamente.
O emulador de terminal que você usa hoje é exatamente o que parece, é um software que está fingindo ser uma velha máquina de teletipo. De certa forma, é quase como se o Unix ainda achasse que você está usando uma máquina de escrever para se comunicar com ela.
No caso de curl
, grava uma linha inteira, em seguida, envia \r
(retorno de carro), levando o cursor para o início da linha e, em seguida, grava outra linha. Como um feed de linha não é enviado, ele continua escrevendo na mesma linha na tela.
Aqui está algo que você pode tentar demonstrar:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Você verá a palavra "Primeiro" impressa (mas nenhuma nova linha é enviada). 5 segundos depois, ele será substituído pela palavra "Second" e uma nova linha será enviada. Você pode repetir esse padrão indefinidamente. Tente adicionar "Terceiro", você verá algo que você provavelmente não esperava; -)
Para obter mais informações sobre esses e outros caracteres de controle, consulte o manual ascii(7)
.