Herbststurm
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Hallo Ist es möglich Programme, die in der Konsole laufen, zu automatisieren? Ich habe ein paar Programme, welche spezielle Eingaben von mir verlangen. Ich würde gerne eine Text-Datei erstellen, in welcher ich in jeder Zeile schreibe was in das Programm eingegeben werden soll. Dies soll dann automatisiert abgearbeitet werden. Ferner verlangt das Programm manchmal bestimmte Tasten, wie F4, oder Enter, dies sollte dann auch an entsprechenden Stellen automatisiert sein. Ist so etwas mit der bash realisierbar? Grüsse
|
mickydoutza
Anmeldungsdatum: 31. Dezember 2010
Beiträge: 2185
|
Herbststurm schrieb: Ich habe ein paar Programme, welche spezielle Eingaben von mir verlangen. Ich würde gerne eine Text-Datei erstellen, in welcher ich in jeder Zeile schreibe was in das Programm eingegeben werden soll. Dies soll dann automatisiert abgearbeitet werden.
Evtl. ist expect ( http://www.nist.gov/el/msid/expect.cfm ) das richtige Tool für dich.
|
sehbeh
Anmeldungsdatum: 31. März 2011
Beiträge: Zähle...
|
Herbststurm schrieb: Hallo Ich würde gerne eine Text-Datei erstellen, in welcher ich in jeder Zeile schreibe was in das Programm eingegeben werden soll. Dies soll dann automatisiert abgearbeitet werden.
typischerweise geht das mit
programm < datei_mit_befehlen
oder
cat datei_mit_befehlen | programm
Ferner verlangt das Programm manchmal bestimmte Tasten, wie F4, oder Enter, dies sollte dann auch an entsprechenden Stellen automatisiert sein.
Mit Steuertasten (F4 etc.) wird das ganze nicht einfach.
Ist so etwas mit der bash realisierbar?
Die bash liesst letzendlich all ihre Befehle aus einer Datei /dev/stdin (Tastatur) und schreibt sie in /dev/stderr und /dev/stdout (beide meist Bildschirm. Du kannst eine bash aufrufen und jede einzelne dieser drei Dateien ersetzen. Das geht prizipiell mit "<", ">" und "|". Nützlich sein könnten noch ein "&" (Kaufmannsund) hinter deien Programmzeile zu setzen damit alles in den Hintergrund verwschindet und ein "nohup" vor die Programmzeile damit das Programm nicht gekillt wir wenn du die Konsole schliesst.
|
sehbeh
Anmeldungsdatum: 31. März 2011
Beiträge: 20
|
Ein Beispiel: wir "steuern fdisk fern". Das machen wir es mal manuell damit wir sehen was passieren sollte. Dazu rufen wir fdisk wie folgt auf:
fdisk /dev/zero
/dev/zero ist eine Datei die beim lesen nur Nullen ausgibt damit fdisk was zu tun bekommt. Wir wollen keine echte Platte partionieren (nur zur allerletzten Vorsicht sind wir auch kein root und geben auch kein sudo ein). Dann geben wir ein paar mehr oder weniger sinnvolle Befehle ein. z.B.
h (mit abschliessenden Retrun für Hilfe)
p (mit abschliessenden Retrun für "print Partitionstabelle")
l (mit abschliessenden Retrun für "liste Patitionstypen")
q (mit abschliessenden Retrun für quit) Nun mach wir das ganze automatisch. Dazu schreiben wir in eine Datei fdiskssteuerung.txt einfach die Buschstaben h p l q getrennt durch Return und rufen folgenden Befehl auf:
cat fdiskssteuerung.txt | fdisk /dev/zero
Die Ausgabe kann man natürlich auch verarbeiten .... usw. ....
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
sehbeh schrieb: typischerweise geht das mit
programm < datei_mit_befehlen
Genau.
oder
cat datei_mit_befehlen | programm
http://partmaps.org/era/unix/award.html#cat
Die bash liesst letzendlich all ihre Befehle aus einer Datei /dev/stdin (Tastatur)
Wenn es die Tastatur ist, dann ist es ein character device und keine Datei.
und schreibt sie in /dev/stderr und /dev/stdout (beide meist Bildschirm. Du kannst eine bash aufrufen und jede einzelne dieser drei Dateien ersetzen. Das geht prizipiell mit "<", ">" und "|". Nützlich sein könnten noch ein "&" (Kaufmannsund) hinter deien Programmzeile zu setzen damit alles in den Hintergrund verwschindet und ein "nohup" vor die Programmzeile damit das Programm nicht gekillt wir wenn du die Konsole schliesst.
Man könnte dann auch noch stderr umleiten, um wirklich alle Verbindugen zum aktuellen Terminal zu kappen. Zu einem richtigen Dämon gehört allerdings noch mehr. Herbststurm, es hängt davon ab, ob Dein Programm (welches?) überhaupt läuft, wenn stdin nicht mit einem character device verbunden ist. Es gibt Programme, die dann den Dienst verweigern. Wichtig wäre auch noch zu wissen, ob das Timing von Tastatureingaben wichtig ist und ob die Eingabe immer fix ist oder Du auch auf Ausgaben reagieren musst (dann wäre das bereits empfohlene expect vielleicht nicht schlecht). Ggf. bietet sich dann aber auch eine Skriptsprache wie Ruby oder Python an, mit der man komfortablere Möglichkeiten hat. Ciao robert
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Hi Danke für die vielen Antworten 👍 Leider übersteigt es mein Wissen, daher step by step: Angenommen ich habe ein Programm, welches in der bash läuft, welches gestartet wird und dann eine bestimmte Eingabe erwartet, z.B. ABCD oder als Eingabe EFGH. Ich möchte eine Textdatei erstellen, welche in einer entsprechenden Zeile z.B. EFGH stehen hat und dies dann an das Programm übergeben wird und nicht ABCD oder sonst irgendwas. Könnte mir jemand zum lernen dafür einen Beispiel Befehl geben wie so etwas aussehen könnte? Thanks
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Herbststurm schrieb: Angenommen ich habe ein Programm, welches in der bash läuft, welches gestartet wird und dann eine bestimmte Eingabe erwartet, z.B. ABCD oder als Eingabe EFGH.
Die Formulierung ist etwas seltsam, da Du zwei mal "Eingabe" erwähnst. Was meinst Du genau? Soll "ABCD" eventuell eine Ausgabe des Programms sein, auf die Du reagieren willst (ein Prompt)?
Ich möchte eine Textdatei erstellen, welche in einer entsprechenden Zeile z.B. EFGH stehen hat und dies dann an das Programm übergeben wird und nicht ABCD oder sonst irgendwas. Könnte mir jemand zum lernen dafür einen Beispiel Befehl geben wie so etwas aussehen könnte?
Wie schon genannt: | $ echo 'EFGH' | dein_programm
|
Oder | $ echo 'EFGH' >input
$ dein_programm <input
|
Wenn wir nicht mehr Informationen bekommen, können wir Dir schwer weiter helfen. Ciao robert
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Das hat funktioniert. Danke euch ☺
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Hi Ich will als Input
2|7
in meine Textdatei schreiben und es funktioniert nicht. Ebenso wenig wie "2|7" und '2|7' Wie sage ich in einer Textdatei, die an ein Skript übergeben wird, dass 2|7 übergeben werden soll? Grüsse
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Herbststurm schrieb: Ich will als Input
2|7
in meine Textdatei schreiben und es funktioniert nicht. Ebenso wenig wie "2|7" und '2|7'
Wie machst Du das denn?
Wie sage ich in einer Textdatei, die an ein Skript übergeben wird, dass 2|7 übergeben werden soll?
| 14:23:14 ~$ echo '2|7' >x
14:23:21 ~$ cat x
2|7
|
Ciao robert
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Hi Was genau bedeutet ~$ Wenn ich mit echo '2|7' > x setze, dann erstelle ich doch eine Datei die x heißt. Ich will aber keine Datei die x heisst, sondern ich will in einer Textdatei 2|7 stehen haben, derart, dass ich es an ein Skript übergeben kann, also im Sinne von ./skript < Textdatei Gruss
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Herbststurm schrieb: Was genau bedeutet ~$
Das ist nur mein Prompt
Wenn ich mit echo '2|7' > x setze, dann erstelle ich doch eine Datei die x heißt. Ich will aber keine Datei die x heisst, sondern ich will in einer Textdatei 2|7 stehen haben, derart, dass ich es an ein Skript übergeben kann, also im Sinne von ./skript < Textdatei
??? Ist doch egal, wie die Datei heißt. Die Datei "x" ist doch eine Textdatei. Wenn Du den Namen nicht magst, nimm halt einen anderen Namen. Ciao robert
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Nein, in meine Textdatei sollen etliche von Zeilen kommen und in einer dieser vielen Zeilen soll 2|7 stehen. Davor und danach sollen Zeilen übergeben werden, z.B. 1
q
l
2
8
q
2|7
q
l
|
mickydoutza
Anmeldungsdatum: 31. Dezember 2010
Beiträge: 2185
|
Herbststurm schrieb: Nein, in meine Textdatei sollen etliche von Zeilen kommen und in einer dieser vielen Zeilen soll 2|7 stehen. Davor und danach sollen Zeilen übergeben werden, z.B. 1
q
l
2
8
q
2|7
q
l
Dann mach es z. B. an der richtigen Stelle bzw. zum richtigen Zeitpunkt, mit:
echo '2|7' >> deinetextdatei.txt
|
Herbststurm
(Themenstarter)
Anmeldungsdatum: 27. Mai 2011
Beiträge: 244
|
Ihr kapiert es glaube ich nicht. Ich erkläre mein Problem einfach nochmal: Ich habe ein Programm das in der bash läuft. Dieses Programm verlangt etliche Eingaben, wie in meiner Liste oben angedeutet. Damit ich die nicht alle von Hand machen will, will ich diese Eingaben Zeilenweise in eine, in EINE, Textdatei schreiben. Irgendwann in dieser Datei muss die Zeichenfolge 2|7 an das Programm übergeben werden. Ich will und werde nicht 2|7 in eine eigene Textdatei schreiben. Da muss es doch etwas weniger behindertes geben?
|