Je voudrais mettre par programme un certain morceau de texte dans le tampon de ligne de commande de bash, lu pour être édité et utilisé comme commande.
Ce que j'attends avec impatience est quelque chose de similaire à read -i
mais pour les commandes.
-i text
Si readline est utilisé pour lire la ligne, le texte est placé dans le tampon d'édition avant le début de l'édition.
Edit : Par programmation, je veux dire que vous voulez écrire cela dans un script , lancer le script et faire préparer le tampon de commande ou modifier l'historique des commandes (comme certaines questions l'ont suggéré).
screen
peut le faire pour vous.Réponses:
J'ai trouvé un moyen hacky de le faire sur la page d'exemples de fzf . Cela fonctionne avec bash 4.3 et perl 5.18:
Il imprime la commande sur stdout, mais la copie également dans le tampon de commande. Il y a aussi un exemple sur la page liée si vous souhaitez exécuter la commande directement.
la source
&TIOCSTI
est un peu plus agréable que0x5412
trop. Il convient de noter qu'il semble que certaines plates-formes (par exemple OpenBSD ) désactivent TIOCSTI. Je pense que cela signifie que cette approche et les zshprint -z
ne fonctionneraient pas.Si cela concerne une fonction que vous allez utiliser dans une liaison readline,
bind -x
vous pouvez la modifierREADLINE_LINE
. ( Exemple )En dehors d'une liaison de ligne de lecture, vous pouvez pousser une fausse commande sur l'historique avec
history -s
.la source
history -s 'foo'
dans un script, l'historique du shell lancé n'est pas modifié du toutsource
). Vous ne pouvez rien faire à partir d'un processus distinct.La réponse de Gilles est correcte, mais pas totalement satisfaisante. En lisant cette question, l'OP veut «prédéfinir» la ligne d'entrée suivante. Dans mon cas, je voulais lire la position actuelle du terminal dans ma fonction PROMPT_COMMAND. Cela fonctionne mais utilise le même tampon de lecture que celui du shell principal, et donc toute entrée utilisateur est rejetée par le fait que j'ai fait un appel interne de lecture dans la fonction. Je voulais donc lire l'entrée utilisateur séparément, faire la lecture de mon terminal, puis remettre l'entrée de lecture dans le tampon d'entrée, ce qui est la question d'origine. Notez que c'est en effet dans le même processus, donc théoriquement cela devrait être possible.
Pour autant que je puisse voir (sur mon bash 4.2), il n'y a pas de fonction pour pousser quelque chose dans la pile d'entrée par programme. Dans zsh, on utilise 'print -z'.
La réponse est donc: ce n'est pas possible en bash, vous devez utiliser zsh pour cela.
la source
Comme alternative à
history -s 'foo'
essayer:la source