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 -i
mas 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).
screen
pode fazer isso por você.Respostas:
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:
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.
fonte
&TIOCSTI
é uma agradável pouco do que0x5412
demasiado. Vale notar que parece que algumas plataformas (por exemplo, OpenBSD ) desativam o TIOCSTI. Eu acho que isso significa que tanto essa abordagem quanto a zshprint -z
não funcionariam.Se isso for para uma função que você usará em uma ligação de linha de leitura
bind -x
, poderá modificarREADLINE_LINE
. ( Exemplo )Fora de uma ligação de linha de leitura, você pode enviar um comando falso para o histórico
history -s
.fonte
history -s 'foo'
em um script, a história do shell lançado não é modificado em tudosource
). Você não pode fazer nada de um processo separado.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.
fonte
Como alternativa para
history -s 'foo'
tentar:fonte