Mettre du texte dans le tampon de ligne de commande bash

9

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 -imais 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é).

gioele
la source
L'IIRC screenpeut le faire pour vous.
strugee
1
Cette réponse sur SU .
Kamil Maciorowski

Réponses:

6

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:

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

# Example usage
echo 'my test cmd' | writecmd

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.

trhodes
la source
Cette réponse est la plus proche de celle demandée par le PO.
reza.safiyat
Syntaxe légèrement différente dans cette réponse , &TIOCSTIest un peu plus agréable que 0x5412trop. 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 zsh print -zne fonctionneraient pas.
dimo414
4

Si cela concerne une fonction que vous allez utiliser dans une liaison readline, bind -xvous pouvez la modifier READLINE_LINE. ( Exemple )

En dehors d'une liaison de ligne de lecture, vous pouvez pousser une fausse commande sur l'historique avec history -s.

Gilles 'SO- arrête d'être méchant'
la source
Le problème est que si je le fais history -s 'foo'dans un script, l'historique du shell lancé n'est pas modifié du tout
gioele
@gioele Vous devez le lancer à partir du shell (par exemple à partir d'un script avec lequel vous chargez source). Vous ne pouvez rien faire à partir d'un processus distinct.
Gilles 'SO- arrête d'être méchant'
2

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.

Stijn Hoop
la source
0

Comme alternative à history -s 'foo'essayer:

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

# or
history -s 'foo'
history -a
history -n
kcd
la source