Redirecionando uma string para o atual TTY

1

Eu tenho um código:

char *tty_name = ttyname(STDIN_FILENO);
char command[255] = "/usr/sbin/writevt -t "; strcpy(stpcpy(command + 21, tty_name), " -T ' \r'"); system(command);

Ele escreve um "espaço" e um "retorno de carro" para o TTY atual. O que funciona bem para meus usos. Mas, eu estou querendo saber se existe uma maneira mais simples de conseguir isso? Eu tentei isso:

echo -e " \r > $(tty)"

Mas não está funcionando.

    
por ignatius 15.06.2018 / 22:29

2 respostas

1

Você poderia simplesmente fazer (assumindo que o echo aceita o -n como "não imprima uma nova linha à direita"):

echo -ne " \r" > "$(tty)"

Redirecionamentos ( > ) não funcionam dentro de aspas.

Um exemplo de "uma linha":

$ echo -n Test; echo -ne " \r " > $(tty); echo "New string"
New string

Uma solução mais robusta (portátil) é usar printf:

$ printf Test;     printf ' \r' > "$(tty)"    ; echo "New string"

E (como exigido pelo POSIX ) use o% comum/dev/tty como o nome do processo tty:

printf ' \r' > /dev/tty

Relacionados: O Posix requer algum dispositivo?

    
por 15.06.2018 / 23:26
2

Você poderia, em vez disso, open(2) /dev/tty e escrever para isso:

#include <err.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
    int ttyfd;
    if ((ttyfd = open("/dev/tty", O_WRONLY)) == -1)
        err(1, "open /dev/tty failed");
    printf("test1\n");
    dprintf(ttyfd, " \rxxx");
    printf("test2\n");
    return 0;
}

( " \r" , por si só, pode não ser visível, pois pode ser destruído pela próxima linha escrita).

    
por 15.06.2018 / 22:53

Tags