2010-04-28 9 views
1

Je voudrais parler à un processus bash interactif.Wrapper autour de bash, contrôle STDIN et STDOUT

est un exemple ici, vous savez ce que je veux archieve:

  1. Programme lance un nouveau processus de bash.
  2. Les types d'utilisateurs "ls" dans mon programme.
  3. Le programme envoie cette commande au processus bash.
  4. Le programme lit toutes les sorties disponibles du bash (y compris l'invite) et les affiche à nouveau à l'utilisateur.
  5. GOTO 1

Comme vous pouvez le deviner, il y a beaucoup de place pour les manipulations astucieuses ici et là ... ;-)

Ce serait merveilleux si cela a également travaillé pour des sous-processus (démarrés par le bash process) et des curses.

Je voudrais implémenter cette fonctionnalité dans Ruby, et j'ai déjà expérimenté avec IO.popen, mais des choses étranges se produisent. Vous êtes également invités à le faire dans d'autres langues.

+0

Quelle est la question réelle ici? –

+0

Ceci est assez lié à ma question ici: http://stackoverflow.com/questions/2380577/vi-input-mode-in-command-line-matlab –

+1

Vous obtiendrez probablement plus d'aide si vous incluez ce que vous avez essayé jusqu'à présent. –

Répondre

5

Ok, j'ai trouvé une solution. Ce travail assez bien, vous pouvez même commencer à vim l'intérieur :-)

require "pty" 

system("stty raw -echo") 

PTY.spawn("bash -i") do |pin, pout| 
    Thread.new do 
     loop do 
      pout.print STDIN.getc.chr 
     end 
    end 

    loop do 
     print pin.sysread(512) 
     STDOUT.flush 
    end 
end 

Cela effectue les opérations suivantes:

  • entrée-sage caractère enable (limité à UNIXoids, j'ai peur)
  • créer un pseudo-ATS, démarrer une session bash interactive à l'intérieur
  • avant chaque caractère de STDIN à la bash
  • imprimer chaque sortie à l'utilisateur
+0

Belle solution! Cependant, j'ai remarqué que le pty n'a que 80 colonnes de large. Y a-t-il un moyen de changer cela? –

+0

@AaronFeng Peut-être pourriez-vous essayer '" COLUMNS = 90 bash -i "' sur ce 'PTY.spawn'. Cela devrait fonctionner je suppose? – Dave

+0

pourrait être mieux à 'PTY.spawn (" stty raw -echo; bash -i ") faire ...'? l'appel 'system' casse mon shell actuel – caesarsol

1

Avez-vous essayé d'utiliser la gemme Session?

Je n'ai aucune expérience avec elle, mais le README semble décrire ce que vous voulez. C'est la description dit, "session kicks the ass", donc il devrait être amusant/productif de jouer avec elle dans tous les cas.