Coloca texto no buffer da linha de comando bash

9

Eu gostaria de colocar programaticamente uma certa parte do texto no buffer de linha de comando do bash, ler para ser editado e usado como um comando.

O que estou ansioso é algo semelhante a read -i , mas para comandos.

-i text If readline is being used to read the line, text is placed into the editing buffer before editing begins.

Editar : Com programaticamente , quero dizer que escreva isso em um script , inicie o script e prepare o buffer de comando ou o histórico de comando modificado (como algumas perguntas sugeriram).

    
por gioele 11.07.2013 / 15:19

4 respostas

5

Eu encontrei uma maneira hacky de fazer isso em a página de exemplos do fzf . Isso funciona com o bash 4.3 e o perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Ele imprime o comando para stdout, mas o copia para o buffer de comando também. Há também um exemplo na página vinculada, se você quiser executar o comando diretamente.

    
por 22.11.2016 / 18:34
4

Se isso for para uma função que você usará em uma ligação readline com bind -x então você pode modificar READLINE_LINE . ( Exemplo )

Fora de uma ligação readline, você pode enviar um comando falso para o histórico com history -s .

    
por 12.07.2013 / 01:53
2

A resposta de Gilles está correta, mas não completamente satisfatória. Ao ler esta pergunta, o OP quer "pré-configurar" a próxima linha de entrada. No meu caso, eu queria ler a posição atual do terminal na minha função PROMPT_COMMAND. Isso funciona, mas usa o mesmo buffer de leitura do shell principal e, portanto, qualquer entrada do usuário é descartada pelo fato de eu ter feito uma chamada de 'leitura' integrada na função. Então, eu queria ler a entrada do usuário separadamente, ler meu terminal e, em seguida, colocar a entrada de leitura de volta no buffer de entrada, que é a pergunta original. Note que isto é de fato dentro do mesmo processo, então teoricamente deveria ser possível.

Tanto quanto eu posso ver (no meu bash 4.2), não há nenhuma função para empurrar algo para a pilha de entrada programaticamente. Em zsh há usando 'print -z'.

Então a resposta é: isso não é possível no bash, você precisa usar o zsh para isso.

    
por 26.05.2014 / 17:02
0

Como uma alternativa para history -s 'foo' try:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
    
por 13.07.2013 / 12:30

Tags