Poner texto en el búfer de la línea de comando bash


9

Me gustaría poner programáticamente un cierto fragmento de texto en el búfer de la línea de comandos de bash, leer para editar y usar como comando.

Lo que estoy esperando es algo similar read -ipero para comandos.

-i text Si se está usando readline para leer la línea, el texto se coloca en el búfer de edición antes de que comience la edición.

Editar : con programación quiero decir que desea escribir esto en un script , iniciar el script y tener el buffer de comando preparado o el historial de comandos modificado (como algunas preguntas han sugerido).


IIRC screenpuede hacer esto por usted.
strugee

Respuestas:


6

Encontré una manera hacky de hacerlo en la página de ejemplos de fzf . Esto funciona con bash 4.3 y perl 5.18:

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

# Example usage
echo 'my test cmd' | writecmd

Imprime el comando en stdout, pero también lo copia en el búfer de comandos. También hay un ejemplo en la página vinculada si desea ejecutar el comando directamente.


Esta respuesta es la más cercana a lo que solicitó el OP.
reza.safiyat

Ligeramente diferente sintaxis en esta respuesta , &TIOCSTIes un poco más agradable que 0x5412también. Vale la pena señalar que parece que algunas plataformas (por ejemplo, OpenBSD ) deshabilitan TIOCSTI. Creo que eso significa que tanto este enfoque como los zsh print -zno funcionarían.
dimo414

4

Si esto es para una función que va a utilizar en un enlace de línea de lectura bind -x, puede modificarla READLINE_LINE. ( Ejemplo )

Fuera de un enlace de línea de lectura, puede insertar un comando falso en el historial con history -s.


El problema es que si lo hago history -s 'foo'en un script, el historial del shell lanzado no se modifica en absoluto
Jueves

@gioele Debe iniciarlo desde el shell (por ejemplo, desde un script con el que carga source). No puedes hacer nada desde un proceso separado.
Gilles 'SO- deja de ser malvado'

2

La respuesta de Gilles es correcta, pero no completamente satisfactoria. Mientras leo esta pregunta, el OP quiere "preseleccionar" la siguiente línea de entrada. En mi caso, quería leer la posición actual del terminal en mi función PROMPT_COMMAND. Eso funciona, pero usa el mismo búfer de lectura que el shell primario, por lo que cualquier entrada del usuario se descarta por el hecho de que hice una llamada incorporada de 'lectura' en la función. Así que quería leer la entrada del usuario por separado, leer mi terminal y luego volver a colocar la entrada de lectura en el búfer de entrada, que es la pregunta original. Tenga en cuenta que esto está dentro del mismo proceso, por lo que, en teoría, debería ser posible.

Hasta donde puedo ver (en mi bash 4.2) no hay función para empujar algo a la pila de entrada mediante programación. En zsh se usa 'print -z'.

Entonces la respuesta es: esto no es posible en bash, necesitas usar zsh para esto.


0

Como alternativa a history -s 'foo'probar:

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

# or
history -s 'foo'
history -a
history -n
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.