Defina a saída do script bash para a linha que chama o script bash

2

Procurei a maior parte de duas horas tentando descobrir se eu poderia encontrar uma maneira de redirecionar a saída de um script bash para a linha que chamava o script bash.

O melhor exemplo que posso usar para descrever o que estou procurando é a função de conclusão que é executada quando se pressiona [TAB]:

$ech[tab] #--> $echo  

Devo observar que o #--> deveria representar como a conclusão finalizou a palavra "echo".

O mais próximo que consegui encontrar foi definir certas opções para "echo", de modo que \b\b possa ser lido, e o stdout possa atualizar a mesma linha. Mas isso não é o que estou procurando. Gostaria de poder transmitir diretamente para a linha atual ou para a próxima na entrada do console. Isso é possível mesmo a partir do script bash?

Editar:

Obrigado a todos que responderam. Eu sinto que devo atualizar minha pergunta original, e possivelmente até mesmo alterar o título da pergunta em si.

O escopo da minha pergunta mudou da seguinte maneira: isso não é mais uma questão sobre o que eu posso ou não conseguir via scripts sozinho. Meu objetivo original era emular a "função" de Conclusão, que aprendi na verdade é um comando bash integrado .

Parece que a biblioteca específica à qual devo chamar atenção (para começar a tentar emular o comando tab-completion do bash) é o Readline library . O bash-completion propriamente dito foi implementado em C (++?).

Em qualquer caso, obrigado novamente pelas respostas perspicazes, e se alguém tiver dicas além do que está mencionado no artigo acima (talvez usando pessoalmente as bibliotecas Readline ou Completion), espero ler seus comentários.

    
por user3842248 15.02.2015 / 12:44

1 resposta

1

Existem duas maneiras de interpretar esta questão - parece que você quer sobrescrever o que já foi escrito no terminal com algo diferente - o que é facilmente feito - ou então você quer alimentar programaticamente a entrada atual do shell interativo. .

O problema é que essas questões acabam significando duas coisas muito diferentes. Um erro que muitas pessoas fazem (uma que eu certamente fiz de qualquer maneira - repetidamente) é igualar os caracteres visuais impressos na tela do terminal com a entrada digitada no teclado como um e o mesmo. Na verdade, porém, o teclado é uma coisa muito mais simples de lidar do que a saída na tela - há muito trabalho entre os dois para transformar o primeiro no segundo. A impressão no terminal é uma conveniência - e geralmente fica.

Se você quiser alimentar a entrada para o shell, escrever na tela provavelmente não ajudará você. Você pode fazer isso, é claro, emitindo uma seqüência de escape padrão VT102 + para mover uma linha terminal poderia parecer:

printf '3[A'

... mas se você fizer isso não parecerá que muita coisa aconteceu - e isso é porque o shell não está lendo isso - está escrevendo no mesmo lugar que você está. Você pode fazer:

printf '3[A'; cat

... para realmente ver o que ele faz, porque cat impedirá que o shell desenhe imediatamente um novo prompt. Você pode (provavelmente) adicionar um parâmetro numérico entre o [ bracket e o A para várias linhas. Você pode descer com B , à esquerda com D e à direita com C . Salvar a saída de tput como chamado com as sequências termcap que você pode encontrar em man termcap para variáveis nomeadas geralmente é o caminho que as pessoas usam - e com razão. Terminais são coisas engraçadas.

Se você quiser se divertir de verdade, tente:

stty raw isig -echoctl; cat >/dev/null

Em um emulador de terminal xterm -compatible (fornecido stty suporta -echoctl - mas se não precisar disso, de qualquer forma) que basicamente permitiria que você andasse em toda a sua tela de terminal com as setas e digite sobre qualquer um dos textos lá. Mas nada disso importa muito porque você está sobrescrevendo a tela - a casca não se importa com isso.

Se você quiser afetar um shell, você deve falar com o seu stdin. Um shell interativo normalmente não ouve muito o que você tem a dizer nessa frente, a menos que você o diga de antemão - quando você o chama. Caso contrário, apenas ouvirá o teclado - é o que é para (ou melhor, mais corretamente, o teclado é o stdin) . Mas você tem opções.

Uma boa maneira de fazer o script de uma entrada do shell interativo é atrasá-lo. Por exemplo, você pode obter um prompt fictício - que não fará nada além de aceitar entrada de teclado e ecoar para stderr como:

sh -niv 2>&1 >/dev/null | ...

Também não precisa ser seu /bin/sh - ele funcionará bem para bash ou o que for. bash fará todo o material típico de readline - mesmo histórico de comando e $PS1 - mas executará -n e -v imprimem toda a entrada no canal. Você pode, então, canalizá-lo da maneira que quiser - talvez sobre outro canal para outro bash depois de filtrar um pouco.

Você pode fazer muitas dessas coisas - mas não pode voltar no tempo. O último comando já terminou quando seu script é iniciado. Você não pode alterá-lo, mas pode organizá-lo para filtrar futuros comandos.

    
por 15.02.2015 / 16:10