Wie man viele Befehle an die Shell sendet und auf den Befehl hinter den Enden wartet [closed]

16

Ich habe ungefähr 20 Befehle und muss das alles an die Unix-Shell senden und das Ergebnis kopieren, aber ich weiß nicht, wie ich es machen soll.

Ich bin mir nicht sicher, welche Shell ich habe, da es sich um ein kleines Programm handelt, das mit Mobile Network Managment verbunden ist. Mit diesem kleinen Programm können wir Befehle über die Leitung senden und die Ergebnisse per Schrei empfangen. Aus diesem Grund kann ich keine Skripte verwenden Senden Sie die Befehle.

Befehl 1 - Verbindung mit einem Server herstellen.

Warten Sie, bis Befehl 1 beendet ist

Befehl 2 - Aktualisieren Sie alle Informationen von Server 1 fertig

Warten.

Befehl 3 . Holen Sie sich einen Parameter.

... und noch mehr solche Befehle.

Ich habe es mit und versuchtcmd1 | cmd2 | cmd3 cmd1 & cmd2 & cmd3 undcmd1;cmd2

Das Problem liegt in cmd1der Verbindung mit einem RNC (Netzwerkelement) und dauert ungefähr 15 Sekunden cmd2. aber arbeite einfach für den ersten cmd. Irgendeine Ahnung, wie man das macht?

Jonathan Raul Tapia Lopez
quelle
3
Verwenden Sie ein Skript? Oder &&zwischen Befehlen.
Bernhard

Antworten:

20

Normalerweise nur cmd1;cmd2;cmd3;cmd4(wenn Sie es in eine Zeile schreiben wollten) oder mit, cmd1 && cmd2 && cmd3 && cmd4wenn Sie cmd3 nicht ausführen möchten, wenn cmd2 fehlschlägt.

Alternativ dazu können ;Sie nur einen Befehl pro Zeile schreiben.

cmd1
cmd2
cmd3
cmd4

Wenn Sie möchten, dass die Befehle im Hintergrund parallel ausgeführt werden, können Sie auch verwenden

cmd1 &
cmd2 &
cmd3 &
cmd4 &
wait # for cmd1-4 to finish

Jede dieser Methoden kann auch in ein Shell-Skript eingefügt werden. Es gibt kaum einen Unterschied zwischen dem, was Sie in einem Shell-Skript schreiben, und dem, was Sie in der eigentlichen Shell selbst schreiben.

Frostschutz
quelle
MM das Problem ist, wenn ich cmd1 sende, muss es wirklich ungefähr 6 Sekunden fertig sein, das Problem ist, wenn es cmd2 sende und cmd1 es immer noch verarbeitet, schlägt fehl.
Jonathan Raul Tapia Lopez
4
In diesem cmd1;cmd2Fall (oder im cmd1 && cmd2Übrigen) wird cmd2 erst ausgeführt, wenn cmd1 beendet wurde (und somit vermutlich beendet ist). Es sollte also kein Problem geben - formulieren Sie Ihre Frage bitte neu oder geben Sie ein Beispiel an, das die Leute tatsächlich reproduzieren können.
Frostschutz
Ok, ich werde die Frage ändern. Danke
Jonathan Raul Tapia Lopez
2

Vielleicht möchten Sie nachsehen sleep, ob Ihre Umgebung dies zulässt. Die komplette Sequenz wäre dann so etwas wie cmd1 && sleep 10s && cmd2.
Hier ist die relevante Manpage zum Thema Schlaf .

LoicAG
quelle
sleep / waiting ist nur nützlich, wenn Sie genau wissen, wie lange das vorherige Programm (das möglicherweise im Hintergrund abläuft) zum Beenden und Beenden benötigt (IE The Halting Problem), ODER wenn Sie garantieren, dass Sie Ihren zweiten Befehl nach dem Intervall unterbrechen und ausführen möchten ist vergangen, was passieren kann, wenn die beiden asynchron sind, Sie aber trotzdem eine gewisse Zeit zwischen ihnen verbringen möchten. Höchstwahrscheinlich ist es nicht das, was Sie wollen. In der Praxis könnte es funktionieren. Aber es ist nicht zuverlässig.
Justin Reeves
1

Verwenden Sie einfach ein Skript, eine Datei mit den Befehlen, die nacheinander ausgeführt werden:

#!/bin/sh

command-01
command-02
...
command-20

In der ersten Zeile (shebang) wird angegeben, dass die folgenden Befehle ausgeführt werden /bin/shsollen. Machen Sie die Datei ausführbar ( chmod u+x your-little-script), und führen Sie sie dann aus ./my-little-script. Auf diese Weise werden Sie keinen Schritt auslassen ;-)

Lesen Sie das Handbuch für die Shell, es bietet eine vollständige Programmiersprache. Überprüfen Sie, bash(1)ob dies verfügbar ist, oder die Korn-Shell ksh(1). Sie bieten viele nützliche Funktionen zur Steuerung des Kontrollflusses in Skripten (oder auch interaktiv).

vonbrand
quelle
Danke, aber ich kann keine Scripte verwenden.
Jonathan Raul Tapia Lopez
Warum? In jedem Fall sollten Sie in der Lage sein, das Skript (oder kurz) als Quelle zu verwenden , es sei denn, dies ist eine sehr faschistische Umgebung . source your-little-script. your-little-script
Vonbrand
Weil ich nicht direkt auf das Unix-System zugreifen kann, habe ich gerne ein Mini-Programm, das nur erlaubt, cmd in Zeilen auszuführen und das Ergebnis durch Schreien zu erhalten, und für die Verwendung, die ich mit diesen Befehlen verwende, ist es nicht praktisch, Skripte zu verwenden.
Jonathan Raul Tapia Lopez
OK, das klärt ein bisschen ... Welche Umgebung ist der Ursprung / das Ziel Ihrer Befehle? Womit versenden Sie Befehle, die ausgeführt werden sollen? Was ist die Remote-Umgebung? Was ist dein Setup dort (hast du einen regulären Account, auf den du zugreifen kannst sshoder PuTTYvielleicht?
vonbrand
-1

Sie könnten so etwas wie expectauf Ihrem lokalen Computer ausführen, cmd1um es zu senden, und warten, bis es beendet ist, bevor Sie es ausgeben cmd2usw. Sie müssen eine angemessene Wartezeit oder eine bestimmte Ausgabe, die angibt, dass der Befehl ausgeführt wurde, herausfinden, um ein richtiges zu schreiben Erwarten Sie Skript.

Natürlich werden cmd1; cmd2; cmd3; cmd4in einem Befehl die Befehle nacheinander ausgeführt.

Tripleee
quelle