Coloque texto no buffer da linha de comando do bash

9

Eu gostaria de colocar programaticamente um determinado pedaço de texto no buffer da linha de comando do bash, ler para ser editado e usado como um comando.

Estou ansioso por algo semelhante a read -imas para comandos.

-i text Se a linha de leitura estiver sendo usada para ler a linha, o texto será colocado no buffer de edição antes do início da edição.

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

gioele
fonte
O IIRC screenpode fazer isso por você.
strugee
1
Esta resposta no SU .
Kamil Maciorowski

Respostas:

6

Eu encontrei uma maneira hacky de fazer isso na 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 também o copia para o buffer de comando. Há também um exemplo na página vinculada, se você deseja executar o comando diretamente.

trhodes
fonte
Essa resposta é a mais próxima do que foi solicitado pelo OP.
Rez.safiyat 4/07
Ligeiramente diferente sintaxe no esta resposta , &TIOCSTIé uma agradável pouco do que 0x5412demasiado. Vale notar que parece que algumas plataformas (por exemplo, OpenBSD ) desativam o TIOCSTI. Eu acho que isso significa que tanto essa abordagem quanto a zsh print -znão funcionariam.
dimo414
4

Se isso for para uma função que você usará em uma ligação de linha de leitura bind -x, poderá modificar READLINE_LINE. ( Exemplo )

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

Gilles 'SO- parar de ser mau'
fonte
O problema é que se eu fizer history -s 'foo'em um script, a história do shell lançado não é modificado em tudo
Gioele
@gioele Você precisa iniciá-lo de dentro do shell (por exemplo, de um script que você carrega source). Você não pode fazer nada de um processo separado.
Gilles 'SO- stop be evil'
2

A resposta de Gilles está correta, mas não completamente satisfatória. Enquanto eu lia essa pergunta, o OP quer "preseed" 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 que o do shell principal e, portanto, qualquer entrada do usuário é descartada pelo fato de eu ter feito uma chamada interna de 'leitura' na função. Então, eu queria ler a entrada do usuário separadamente, fazer a leitura do meu terminal e colocar a entrada de leitura novamente no buffer de entrada, que é a pergunta original. Observe que isso é realmente dentro do mesmo processo, portanto teoricamente deveria ser possível.

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

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

Stijn Hoop
fonte
0

Como alternativa para history -s 'foo'tentar:

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

# or
history -s 'foo'
history -a
history -n
kcd
fonte