2017-06-09 2 views
0

Je suis scripting dans Ruby et je veux insérer une commande dans l'historique de Zshell qui appelle le script Ruby. J'ai essayé ceci mais il ne peut pas accéder à l'appel Zshell (je pense)Ajouter une commande à l'historique de Zsh à partir de Ruby Script

#!/usr/bin/env ruby 
`zsh -c print -s what` 

Des conseils?

+1

Un processus enfant ne peut pas modifier l'environnement de son parent (voir par exemple https://stackoverflow.com/a/263022/2088135) –

+0

Je ne suis pas sûr que cela soit possible, car il existe un fichier '' .zsh_history'' mais il est seulement chargé au démarrage; le shell actuel ne fait pas référence à tout, il garde juste son historique en mémoire. Si vous ouvrez un nouveau terminal et exécutez quelque chose, il ne sera ajouté à aucun shell ouvert. À moins qu'il y ait une fonction zsh, vous pouvez appeler pour ajouter quelque chose à la mémoire de tous les shells ouverts (ou au moins un seul shell ouvert), vous pourriez ne pas avoir de chance. – Piccolo

+0

@piccolo Je pourrais lancer 'fc -R' pour recharger un Zshell modifié, mais je pense que nous sommes de nouveau dans le même problème, non? –

Répondre

1

Une façon vous pouvez aller à faire est la suivante:

Faire une fonction zsh qui appelle fc -R après la fin de l'exécution d'une certaine commande comme suit:

function rb_yourprogram { 
    ruby /path/to/your/program.rb && fc -R 
} 

Dans Ruby, ajoutez à la fichier ~/.zsh_history:

File.open("~/.zsh_history", "a") do |f| 
    f.puts "adds this line to history" 
end 

maintenant, vous pouvez appeler le programme en tapant rb_yourprogram dans zsh, et après la fin e xecuting chargera le fichier d'historique et aura donc cette nouvelle ligne d'historique (en plus de tout ce qui est écrit dans d'autres instances de zsh depuis que vous avez ouvert le premier shell).

Vous pouvez également surcharger la commande ruby dans zsh afin qu'il appellera toujours fc -R après avoir terminé l'exécution:

function ruby { 
    builtin ruby "[email protected]" && fc -R 
} 
+0

Merci, j'essayais de le faire ici: https://gist.github.com/drosenstark/3557dfebd73857cb724a59a33bbbc1cc mais cette solution - bien qu'étonnante - est un peu trop intelligente à mon goût. Mais il n'y a pas le choix, je suppose ... –