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.