Comment envoyer de nombreuses commandes au shell et attendre la commande derrière les extrémités [fermé]

16

J'ai environ 20 commandes et je dois envoyer tout cela au shell Unix et copier le résultat, mais je ne sais pas comment le faire.

Je ne sais pas quel shell j'ai, car c'est un petit programme connecté à Mobile Network Managment, et avec ce petit programme, nous avons accès pour envoyer des commandes par ligne et recevoir les résultats par cri, c'est pourquoi je ne peux pas utiliser de scripts pour l'envoi des commandements.

Commande 1 - Connectez-vous à un serveur.

Attendez la fin de la commande 1

Commande 2 - Mettre à jour toutes les informations de la fin du serveur 1

Attendez.

Commande 3 . Obtenez un paramètre.

... et plus de ces commandes.

J'ai essayé avec cmd1 | cmd2 | cmd3 et cmd1 & cmd2 & cmd3 etcmd1;cmd2

Le problème est avec cmd1sa connexion à un RNC (élément de réseau) et prend environ 15 secondes, après cela cmd2a du sens. mais juste travailler pour le premier cmd. Un indice, comment gérer cela?

Jonathan Raul Tapia Lopez
la source
3
Utilisez un script? Ou &&entre les commandes.
Bernhard

Réponses:

20

Habituellement juste cmd1;cmd2;cmd3;cmd4(si vous vouliez l'écrire sur une seule ligne), ou utilisez cmd1 && cmd2 && cmd3 && cmd4si vous ne voulez pas exécuter cmd3 lorsque cmd2 échoue.

Sinon, ;vous pouvez simplement écrire une commande par ligne.

cmd1
cmd2
cmd3
cmd4

Si vous souhaitez que les commandes s'exécutent en parallèle en arrière-plan, vous pouvez également utiliser

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

L'une ou l'autre de ces méthodes peut également être placée dans un script shell. Il y a peu de différence entre ce que vous écrivez dans un script shell et ce que vous écrivez dans le shell lui-même.

frostschutz
la source
MM le problème c'est quand j'envoie cmd1 il faut vraiment terminer environ 6 secondes, le problème c'est quand il envoie cmd2 et cmd1 son traitement échoue.
Jonathan Raul Tapia Lopez
4
Dans le cmd1;cmd2cas (ou cmd1 && cmd2d'ailleurs) cmd2 ne fonctionnera pas tant que cmd1 ne sera pas terminé (et donc probablement terminé). Il ne devrait donc pas y avoir de problème - veuillez reformuler votre question ou fournir un exemple que les gens peuvent réellement reproduire.
frostschutz
Ok je vais modifier la question. merci
Jonathan Raul Tapia Lopez
2

Vous voudrez peut-être examiner sleep, si votre environnement le permet. La séquence complète ressemblerait alors à quelque chose cmd1 && sleep 10s && cmd2.
Voici la page de manuel appropriée pour dormir .

LoicAG
la source
sommeil / attente n'est utile que si vous savez de façon déterministe combien de temps le programme précédent (qui pourrait engendrer un processus en arrière-plan) prend pour se terminer et quitter (IE The Halting Problem) OU si vous garantissez que vous voulez interrompre et exécuter votre deuxième commande après l'intervalle s'est écoulé, ce qui peut se produire si les deux sont asynchrones mais que vous voulez toujours un peu de temps entre eux. Mais ce n'est probablement pas ce que vous voulez. En pratique, cela pourrait fonctionner. Mais ce n'est pas fiable.
Justin Reeves
1

Utilisez simplement un script, un fichier contenant les commandes à exécuter les unes après les autres, comme:

#!/bin/sh

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

La première ligne (shebang) indique d'exécuter les commandes suivantes en utilisant /bin/sh, rendez le fichier exécutable ( chmod u+x your-little-script), puis vous pouvez l'exécuter par ./my-little-script. De cette façon, vous ne laisserez pas une étape ;-)

Lisez le manuel du shell, il fournit un langage de programmation complet. Vérifiez bash(1)si c'est ce qui est disponible, ou bien le shell Korn ksh(1). Ils offrent de nombreuses fonctionnalités utiles pour contrôler le flux de contrôle dans les scripts (ou interactivement, d'ailleurs).

vonbrand
la source
Merci mais je ne peux pas utiliser de scritps.
Jonathan Raul Tapia Lopez
Pourquoi? Dans tous les cas, à moins que ce ne soit un environnement très fasciste, vous devriez pouvoir trouver le script: source your-little-script(ou . your-little-scriptpour faire court).
vonbrand
Étant donné que je n'ai pas directement accès au système Unix, j'ai comme un mini programme qui permet simplement d'exécuter cmd en ligne et d'obtenir le résultat par cri, et pour l'utilisation que je vais utiliser avec ces commandes, il n'est pas pratique d'utiliser des scripts.
Jonathan Raul Tapia Lopez
OK, ça clarifie un peu les choses ... Quel environnement est l'origine / destination de vos commandes? Qu'utilisez-vous pour envoyer des commandes à exécuter? Qu'est-ce que l'environnement distant? Quelle est votre configuration là-bas (avez-vous un compte régulier, auquel vous pouvez accéder via sshou PuTTYpeut-être?
vonbrand
-1

Vous pouvez exécuter quelque chose comme expectsur votre ordinateur local pour envoyer cmd1et attendre qu'il se termine avant d'émettre, cmd2etc. Vous devez déterminer un délai raisonnable pour attendre, ou une sortie spécifique qui indique que la commande est exécutée, afin d'écrire une Attendez-vous à un script.

Bien sûr, cmd1; cmd2; cmd3; cmd4dans une commande, les commandes seront exécutées l'une après l'autre.

tripleee
la source