Come inviare molti comandi alla shell e attendere il comando dietro estremità [chiuso]


16

Ho circa 20 comandi e devo inviare tutto questo alla shell Unix e copiare il risultato, ma non so come farlo.

Non sono sicuro di quale shell ho, perché è un piccolo programma collegato a Mobile Network Managment e con questo piccolo programma abbiamo accesso per inviare comandi per linea e ricevere i risultati tramite urlo, per questo motivo non posso usare script per invio dei comandi.

Comando 1 : connettersi a un server.

Attendere il completamento del comando 1

Comando 2 : aggiorna tutte le informazioni dalla fine del server 1

Aspettare.

Comando 3 . Ottieni qualche parametro.

... e altri comandi simili.

Ho provato con cmd1 | cmd2 | cmd3 e cmd1 & cmd2 & cmd3 ecmd1;cmd2

Il problema è che è cmd1collegato a un RNC (elemento di rete) e richiede circa 15 secondi, dopo che cmd2ha senso. ma lavora solo per il primo cmd. Qualche idea, come eseguirlo?


3
Usa una sceneggiatura? O &&tra i comandi.
Bernhard

Risposte:


20

Di solito solo cmd1;cmd2;cmd3;cmd4(se si desidera scriverlo su una riga), o usando cmd1 && cmd2 && cmd3 && cmd4se non si desidera eseguire cmd3 quando cmd2 non riesce.

In alternativa a ;te puoi semplicemente scrivere un comando per riga.

cmd1
cmd2
cmd3
cmd4

Se vuoi che i comandi vengano eseguiti in parallelo in background, puoi anche usare

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

Entrambi questi metodi possono anche essere inseriti in uno script di shell. C'è poca differenza tra ciò che scrivi in ​​uno script di shell e ciò che scrivi nella shell stessa.


MM il problema è che quando invio cmd1 deve davvero finire circa 6 secondi, il problema è quando invia cmd2 e cmd1 continua a non riuscire .
Jonathan Raul Tapia Lopez,

4
Nel cmd1;cmd2caso (o cmd1 && cmd2per quello) cmd2 non funzionerà fino a quando cmd1 non sarà uscito (e quindi presumibilmente finito). Quindi non dovrebbe esserci alcun problema: ti preghiamo di riformulare la tua domanda o fornire un esempio che le persone possano effettivamente riprodurre.
frostschutz

Ok, ho intenzione di modificare la domanda. grazie
Jonathan Raul Tapia Lopez il

2

Potresti voler esaminare sleep, se il tuo ambiente lo consente. La sequenza completa sarebbe quindi qualcosa di simile cmd1 && sleep 10s && cmd2.
Ecco la pagina man relativa al sonno .


sleep / wait è utile solo se sai in modo deterministico quanto tempo impiega il programma precedente (che potrebbe generare un processo in background) a terminare ed uscire (IE The Halting Problem) OPPURE se garantisci di voler interrompere ed eseguire il tuo secondo comando dopo l'intervallo è passato, il che potrebbe accadere se i due sono asincroni ma si desidera ancora passare un po 'di tempo tra di loro. Molto probabilmente, non è quello che vuoi. In pratica, potrebbe funzionare. Ma non è affidabile.
Justin Reeves il

1

Basta usare uno script, un file contenente i comandi per eseguire uno dopo l'altro, come:

#!/bin/sh

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

La prima riga (shebang) dice di eseguire i seguenti comandi usando /bin/sh, rendere il file eseguibile ( chmod u+x your-little-script), quindi è possibile eseguirlo ./my-little-script. In questo modo non lascerai alcun passo indietro ;-)

Leggi il manuale della shell, fornisce un linguaggio di programmazione completo. Controlla bash(1)se questo è ciò che è disponibile, oppure la shell Korn ksh(1). Offrono molte funzioni utili per controllare il flusso di controllo negli script (o interattivamente, per quella materia).


Grazie ma non posso usare scritps.
Jonathan Raul Tapia Lopez,

Perché? In ogni caso, a meno che questo non sia un ambiente molto fascista, dovresti essere in grado di procurarti lo script: source your-little-script(o . your-little-scriptin breve).
vonbrand,

Perché, non ho accesso diretto al sistema unix. Ho come un mini programma ciò che mi consente di eseguire cmd in linee e ottenere il risultato tramite urlo, e per l'uso che userò con questi comandi non è pratico usare gli script.
Jonathan Raul Tapia Lopez,

OK, questo chiarisce un po 'le cose ... Qual è l'ambiente di origine / destinazione dei tuoi comandi? Cosa usi per spedire i comandi da eseguire? Cos'è l'ambiente remoto? Qual è la tua configurazione lì (hai un account normale, a cui puoi accedere tramite ssho PuTTYforse?
vonbrand

-1

Potresti eseguire qualcosa di simile expectsul tuo computer locale da inviare cmd1e attendere che finisca prima di emettere cmd2ecc. Devi trovare un periodo ragionevole di attesa o un output specifico che indichi che il comando è stato eseguito, al fine di scrivere un corretto Aspettati lo script.

Ovviamente, cmd1; cmd2; cmd3; cmd4in un comando eseguiranno i comandi in sequenza, uno dopo l'altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.