Como inserir a última linha de saída na linha de comando?

6

O bash fornece uma maneira de inserir a última linha de saída do comando anterior na linha de comando?

Por exemplo, suponha que eu executei apenas ls -1 e a saída foi

file1
file2
file3

Existe uma combinação de teclas que pode inserir o texto file3 na posição do cursor?

(Similar a Alt + . , que insere o último argumento do comando anterior, mas aqui eu quero colar a saída, não o comando em si.)

    
por Berry Tsakala 30.09.2013 / 00:33

5 respostas

1

Aqui está uma solução incompleta. Eu acho que poderia ser feito para trabalhar, mais ou menos.

Primeiro, organizamos a captura de todas as saídas do teclado, executando dentro de um ambiente script . (Há muitos problemas com isso; veja abaixo.) Precisamos passar o -f flag para script para que ele libere a saída imediatamente para o arquivo typescript. Também escolhemos um nome de arquivo em /tmp :

script -f /tmp/typescript

Dentro do ambiente de script, nós definimos um atalho de teclado para extrair a última linha do arquivo typescript e empurrá-lo para o histórico: (liguei os comandos a Ctl + y Ctl + y supondo que você não o digita com muita frequência.Um bug no bash evita que você vincule comandos a sequências com mais de dois bytes e isso elimina todas as chaves Fn , por exemplo. p>

bind -x '"\C-y\C-y":history -s $(tail -n2 X|head -n1)'

Agora, para inserir a última linha de saída na linha de comando atual, "precisamos" digitar ctl-y ctl-y ! ! esc ^ , que copia a última linha de saída para o histórico, depois insere uma expansão de histórico e aciona a expansão do histórico. . Há provavelmente uma maneira melhor de fazer isso, mas esse tipo de trabalho. É um monte de keypresses, por isso, atribuímos a uma macro de teclado:

bind '"\eOP":"\C-y\C-y!!\e^"'

Até certo ponto, isso funciona. No entanto, agora precisamos lidar com a fealdade de script , que salva a saída precisamente como foi gerada , códigos de controle VT-102 e tudo. Ele salva o que você digitou, exatamente como você digitou, incluindo todos os erros que você retrocedeu, os backspaces e os novos caracteres. Ele salva o retorno de carro ( ctl-m ) que é enviado no final de cada linha. Resumindo, não é realmente um texto que você gostaria de inserir em uma linha de comando.

Conceitualmente, funciona. Tudo o que é necessário é uma ferramenta melhor para salvar a saída da sessão e, talvez, uma maneira mais elegante de inserir o resultado da chamada de um comando shell do que empurrá-lo para o histórico e depois recuperá-lo novamente.

    
por 01.10.2013 / 03:08
7

Acho que o mais próximo que você chegará é:

$ do_something_with "$(!!|tail -1)"
    
por 30.09.2013 / 01:00
1

Espero que isso seja o que você pediu

ls -l | tail -1 | tee

    
por 30.09.2013 / 03:52
1

link

shell-expand-line (M-C-e)

Expand the line as the shell does. This performs alias and history expansion as well as all of the shell word expansions (see Shell Expansions).

Por exemplo:

$ touch one two three four
$ echo 'ls | tail -n1' 

ctrl + alt + e

$ echo two
    
por 30.09.2013 / 15:49
0

Uma solução que funciona para mim, embora não seja uma resposta 100% real, é baseada nas respostas de rici e glenn jackman aqui, além de ligar uma chave a esse comando.

O comando de Glenn executará o último programa novamente, capturando sua última linha e substituindo-se pelo conteúdo da linha na linha de comando:

"$(!!|tail -1)"

Eu quero deixar claro: Este truque irá executar o comando mais uma vez , então, depende do caso, pode ser prejudicial, lento ou simplesmente errado - baseado no caso.

A última coisa foi ligar a combinação de teclas:

Eu usei Alt + / pois é similar ao combo de teclas que dá o último argumento digitado Alt + . / kbd>

bind '"^[/":"\"$(!!|tail -1)\""'

( veja aqui como trabalhos de ligação de chaves )

Agora adicione o comando bind ao meu perfil (.bashrc ou .profile ou algo assim).

    
por 02.10.2013 / 12:13