Como posso salvar a saída de “echo-e '\ e] 4; 40;? \ a'” em uma variável ou canalizá-la?

2

Inspirado por esta postagem no fórum , executei este comando em um prompt do Bash:

echo -e '\e]4;40;?\a'

Quais resultados:

# 4;rgb:8b8b/cdcd/0000

Mas o mais estranho é que a saída de alguma forma se torna o próximo comando do meu prompt, em vez de ser impressa acima do meu prompt.

Gostaria de salvar o texto "4; rgb: 8b8b / cdcd / 0000" em uma variável, mas para minha surpresa, o mesmo problema acontece quando faço isso:

output=$(echo -e '\e]4;30;?\a')
echo "$output"

O mesmo para isso:

echo -e '\e]4;30;?\a'   |   awk  -F ":"  ' { print $1 } '

Como posso salvar a saída "4; rgb: 8b8b / cdcd / 0000" em uma variável ou canalizá-la?

Obrigado por qualquer ajuda!

.

Edit: Obrigado pela resposta! Mas o mesmo problema acontece com isso também:

out='eval "echo -e '\e]4;40;?\a'"'; echo $out

.

Eu tentei criar uma substring da variável $ out, mas isso imprimiu uma linha em branco em vez de "4; rgb":

substring=${out:0:5}; echo "$substring"

.

Eu também tentei isso:

out='eval "echo -e '\e]4;40;?\a'"'; echo $out |  awk  -F ":"  ' { print $1 } '

o awk responde com uma linha em branco (em vez de "4; rgb"), então "4; rgb: 8b8b / cdcd / 0000" aparece no meu prompt como o próximo comando.

    
por Apollia 01.04.2016 / 13:20

4 respostas

1

Em vez de adicionar ferramentas, você pode usar as que provavelmente terá (e, no processo, aprender alguma coisa). Se você quiser usar o Puppy Linux efetivamente, isso seria uma coisa boa em>.

Aqui está um exemplo rápido usando apenas o shell, cat , printf , stty e tty (todas as partes do GNU CoreUtils, embora o exemplo evita o uso de recursos não-portáteis fornecidos por esses programas):

#!/bin/sh
# $Id: osc4-demo,v 1.2 2016/04/03 12:50:20 tom Exp $
# A simple demo for retrieving a color using xterm's OSC 4 control

osc4_demo() {
    result=$(
        old=$(stty -g);
        stty raw -echo min 0 time 2;
        printf '3]4;%d;?
$ osc4-demo 4 44 144 244
asked 4, result: ^[]4;4;rgb:0000/0000/eeee^G
asked 44, result: ^[]4;44;rgb:0000/d7d7/d7d7^G
asked 144, result: ^[]4;144;rgb:afaf/afaf/8787^G
asked 244, result: ^[]4;244;rgb:8080/8080/8080^G
7' "$1" >$(tty); cat $(tty); stty $old ) echo "asked $1, result: $(echo "$result" | cat -v)" } for code in "$@" do osc4_demo $code done

O script define a variável result e a ecoa no formato imprimível. Por exemplo:

exec < /dev/tty

Funciona alterando temporariamente o terminal para o modo raw, com a capacidade de ler os valores sem uma nova linha final. Isso é essencialmente o que as ferramentas fariam.

Como o script envia / recebe para / do real tty , você pode redirecionar o resultado para um arquivo. Ele usa a opção -v de cat para tornar o resultado legível (embora a variável real controle os caracteres de controle).

Eu considerei adicionar

#!/bin/sh
# $Id: osc4-demo,v 1.2 2016/04/03 12:50:20 tom Exp $
# A simple demo for retrieving a color using xterm's OSC 4 control

osc4_demo() {
    result=$(
        old=$(stty -g);
        stty raw -echo min 0 time 2;
        printf '3]4;%d;?
$ osc4-demo 4 44 144 244
asked 4, result: ^[]4;4;rgb:0000/0000/eeee^G
asked 44, result: ^[]4;44;rgb:0000/d7d7/d7d7^G
asked 144, result: ^[]4;144;rgb:afaf/afaf/8787^G
asked 244, result: ^[]4;244;rgb:8080/8080/8080^G
7' "$1" >$(tty); cat $(tty); stty $old ) echo "asked $1, result: $(echo "$result" | cat -v)" } for code in "$@" do osc4_demo $code done

para melhorar isso, baseado em outros scripts para o xterm (veja, por exemplo, Usando exec no Advanced Bash-Scripting Guide ), mas descobriu que isso não ajudou com o traço do Debian.

A expressão multilinha pode, é claro, ser dobrada em uma única linha para aqueles que insistem nesse formulário, com a usual perda de clareza.

Leitura adicional:

por 03.04.2016 / 15:04
5

A string que você obtém 4;rgb:8b8b/cdcd/0000 não é realmente a saída do comando echo, mas um efeito colateral da string ecoada sendo enviada ao seu emulador de terminal e a última reagindo a ela emitindo esses caracteres, como se você os tivesse digitado .

O shell não está ciente disso e essa é a razão pela qual tentar capturar os resultados de saída em strings vazias.

Aqui está uma maneira de alcançar o que você deseja:

script -qc "echo -e '\e]4;40;?\a';read foo" /tmp/foo
out=$(tail -1 /tmp/foo)

Aqui estão algumas explicações: O comando script está capturando tudo o que é exibido na tela, o read foo one está lá para evitar que o comando script termine antes que o emulador de terminal tenha saído da cadeia você quer conseguir. O comando tail -1 está removendo as linhas indesejadas geradas pelo comando script .

    
por 01.04.2016 / 15:03
1

Você também pode usar xtermcontrol --get-colorN para as primeiras 16 cores. Infelizmente, ele não suporta toda a paleta de cores 256.

    
por 02.04.2016 / 08:16
-1

Experimente com eval (um bom post sobre eval pode ser encontrado aqui )

out='eval "echo -e '\e]4;40;?\a'"'; echo $out

O conteúdo é armazenado em $ out, eles são impressos somente se eu incluir echo $out

    
por 01.04.2016 / 13:28