Cómo enviar muchos comandos al shell y esperar el comando detrás de los extremos [cerrado]

16

Tengo alrededor de 20 comandos y tengo que enviar todo esto al shell de Unix y copiar el resultado, pero no sé cómo hacerlo.

No estoy seguro de qué shell tengo, porque es un pequeño programa conectado a Mobile Network Management, y con este pequeño programa tenemos acceso para enviar comandos por línea y recibir los resultados por grito, por eso no puedo usar scripts para enviando los comandos.

Comando 1 : conectarse con un servidor.

Espere hasta que termine el comando 1

Comando 2 : actualice toda la información del servidor 1 finalice

Espere.

Comando 3 . Obtén algunos parámetros.

... y más de esos comandos.

Lo intenté con cmd1 | cmd2 | cmd3 y cmd1 & cmd2 & cmd3 ycmd1;cmd2

El problema es que está cmd1conectado a un RNC (elemento de red) y tarda unos 15 segundos, después de eso cmd2tiene sentido. pero solo trabaja para el primer cmd. Alguna pista, ¿cómo ejecutar esto?

Jonathan Raul Tapia Lopez
fuente
3
¿Usar un guión? O &&entre comandos.
Bernhard

Respuestas:

20

Por lo general, solo cmd1;cmd2;cmd3;cmd4(si desea escribirlo en una línea), o usarlo cmd1 && cmd2 && cmd3 && cmd4si no desea ejecutar cmd3 cuando cmd2 falla.

Alternativamente ;, puede escribir un comando por línea.

cmd1
cmd2
cmd3
cmd4

Si desea que los comandos se ejecuten en paralelo en segundo plano, también puede usar

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

Cualquiera de esos métodos también se puede poner en un script de shell. Hay poca diferencia entre lo que escribe en un script de shell y lo que escribe en el propio shell.

Frostschutz
fuente
MM: el problema es que cuando envío cmd1 realmente tiene que terminar alrededor de 6 segundos, el problema es que cuando envía cmd2 y cmd1 su proceso aún falla.
Jonathan Raul Tapia Lopez
44
En el cmd1;cmd2caso (o cmd1 && cmd2para el caso) cmd2 no se ejecutará hasta que cmd1 haya salido (y, por lo tanto, presumiblemente haya terminado). Por lo tanto, no debería haber ningún problema: reformule su pregunta o proporcione un ejemplo que las personas puedan reproducir.
frostschutz
Ok, voy a modificar la pregunta. gracias
Jonathan Raul Tapia Lopez
2

Es posible que desee investigar sleep, si su entorno lo permite. La secuencia completa sería entonces algo así cmd1 && sleep 10s && cmd2.
Aquí está la página de manual relevante para dormir .

LoicAG
fuente
dormir / esperar solo es útil si sabe de manera determinista cuánto tiempo tarda el programa anterior (que puede generar un proceso en segundo plano) en finalizar y salir (es decir, el problema de detención) O si garantiza que desea interrumpir y ejecutar su segundo comando después del intervalo ha pasado, lo que podría suceder si los dos son asíncronos, pero aún quieres pasar un tiempo entre ellos. Sin embargo, lo más probable es que no sea lo que quieres. Hablando prácticamente, podría funcionar. Pero no es confiable.
Justin Reeves
1

Simplemente use un script, un archivo que contenga los comandos para ejecutar uno tras otro, como:

#!/bin/sh

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

La primera línea (shebang) le dice que ejecute los siguientes comandos usando /bin/sh, haga que el archivo sea ejecutable ( chmod u+x your-little-script) y luego puede ejecutarlo ./my-little-script. De esta manera no dejarás ningún paso fuera ;-)

Lea el manual del shell, proporciona un lenguaje de programación completo. Echa un vistazo bash(1)si eso es lo que está disponible, o si no el shell Korn ksh(1). Ofrecen muchas funciones útiles para controlar el flujo de control en los scripts (o interactivamente, para el caso).

vonbrand
fuente
Gracias pero no puedo usar scritps.
Jonathan Raúl Tapia López
¿Por qué? En cualquier caso, a menos que este sea un entorno muy fascista, debería poder obtener el script: source your-little-script(o . your-little-scriptpara abreviar).
vonbrand
Debido a que no tengo acceso directo al sistema unix, tengo un mini programa que solo permite ejecutar cmd en líneas y obtener el resultado por grito, y para el uso que voy a usar con estos comandos no es práctico usar scrips.
Jonathan Raúl Tapia López
OK, eso aclara un poco las cosas ... ¿Qué entorno es el origen / destino de tus comandos? ¿Qué utilizas para enviar comandos a ejecutar? ¿Qué es el entorno remoto? ¿Cuál es su configuración allí (tiene una cuenta regular, a la que puede acceder a través de ssho PuTTYtal vez?)
vonbrand
-1

Puede ejecutar algo como expecten su computadora local para enviar cmd1y esperar a que termine antes de emitir, cmd2etc. Debe calcular un período razonable para esperar, o una salida específica que indique que el comando se ha ejecutado, para poder escribir correctamente. Esperar guión.

Por supuesto, cmd1; cmd2; cmd3; cmd4en un comando se ejecutarán los comandos en secuencia, uno tras otro.

tripleee
fuente