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 -i
pero 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).
screen
puede hacer esto por usted.Respuestas:
Encontré una manera hacky de hacerlo en la página de ejemplos de fzf . Esto funciona con bash 4.3 y perl 5.18:
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.
fuente
&TIOCSTI
es un poco más agradable que0x5412
tambié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 zshprint -z
no funcionarían.Si esto es para una función que va a utilizar en un enlace de línea de lectura
bind -x
, puede modificarlaREADLINE_LINE
. ( Ejemplo )Fuera de un enlace de línea de lectura, puede insertar un comando falso en el historial con
history -s
.fuente
history -s 'foo'
en un script, el historial del shell lanzado no se modifica en absolutosource
). No puedes hacer nada desde un proceso separado.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.
fuente
Como alternativa a
history -s 'foo'
probar:fuente