2016-06-07 7 views
0

Ist es möglich programmgesteuert einige repl (z. B. mongo) einzugeben und programmgesteuert damit zu interagieren? Das heißt, können Sie dies tun programmatisch:Programmatisch Befehle an eine interaktive REPL von Bash senden?

$ mongo 
MongoDB shell version: 2.4.8 
connecting to: test 
> db.collections 
test.collections 
> exit 
bye 

Alles, was tut, ist:

  1. Anmeldung zum REPL mit dem mongo Befehl. Ich weiß, dass es irgendwie möglich ist, dies zu tun, ich habe es bis create interactive REPL's in the Node.js world getan. Es wäre hilfreich zu wissen, wie man das direkt in bash macht.
  2. Einmal eingeloggt, tippte ich db.collections, nur die REPL erkunden. Diese SO Frage fragt, können Sie diese programmgesteuert tun? Wie können Sie vielleicht (a) einen Kindprozess/REPL aus einem Bash-Skript erstellen und dann (b) beliebige Nachrichten wie diese db.collections senden, die sie auswertet. (Und können Sie die Antwort/Ausgabe zurück erhalten).
  3. Programmgesteuertes Abmelden von der REPL.

Ist das möglich?

+2

Suche hier nach Qs mit "Here-Docs" (abgegrenzt durch '<< EOS .... cmds ... EOS" (Leider kann 'EOS' eine beliebige Zeichenfolge sein, manchmal siehst du' _ _ 'oder' << EOD', oder << ... '(ein Dutzend anderer Dinge.). Konzentrieren Sie sich auf" Here-Documents "und machen Sie kleine Tests, um zu sehen, ob' Mongo' von ihnen lesen kann 'Viel Glück. – shellter

+0

als Shelter, sagte, verwenden Sie [hier Dokument] (http://mywiki.wooledge.org/HereDocument). Wenn das nicht funktioniert (einige Befehle nicht umgeleiteten' stdin' erlauben), gehen Sie für [ 'expect'] (http://www.unix.com/man-page/all/1/expect/) basierte Lösung – anishsane

+0

Vielen Dank, ich werde diese überprüfen. –

Antwort

1

Sie könnten ein expect Skript schreiben, das diese Befehle interaktiv für Sie eingibt. Ich bin kein normaler Benutzer erwarten würde, aber ich denke, es ist etwas, sollte wie folgt aussehen:

#!/usr/bin/expect 
mongo 
set timeout 10 
expect "MongoDB shell version: 2.4.8" 
send "db.collections" 
expect "test.collections" 
send exit 

viele Beispiele gibt es da draußen, die es leicht machen, sollte eine minimale Arbeitsbeispiel zu erstellen.