11 votos

Ejecuta otro comando cuando el comando anterior se completa

Hoy abrí gnome-terminal y escribí

ls && sleep 4 && gnome-terminal

para abrir otra terminal después de la finalización de la ls comando y espera durante 4 segundos.
Por lo que correctamente se abre una nueva terminal, después de la anterior comandos completamente ran (incluyendo sleep 4).

Después de eso, la próxima vez me escribió un nuevo comando

ls -lR && sleep 4 && gnome-terminal

El comando ls -lR completado después de 3 segundos, pero después de que ninguno de los comandos sleep 4 y gnome-terminal se ejecutó correctamente.

¿Cuál es el problema?

24voto

vidarlo Puntos 81

&& medios para ejecutarlo si el comando anterior fue un éxito. En Unix que generalmente significa estado de salida 0.

$ ls barfoofba && echo "This will not be echo'd"
ls: cannot access 'barfoofba': No such file or directory
$ ls bar && echo "This will be echo'd"  
This will be echo'd

En primera instancia, ls no tuvo éxito, por lo que terminó con una salida distinto de cero de estado, y bash no ejecutar el segundo comando.

En el segundo ejemplo, yo ls había un archivo existente, por lo que ls terminó con 0 como salida de estado, y se ejecutó el comando.

Si desea ejecutar comandos de manera incondicional, es decir, no depende del resultado de la primera, se pueden separar con ; como esta

 command1; command2; command3 

y así sucesivamente.

Por lo tanto usted puede hacer

ls -lR ; sleep 4 ; gnome-terminal

En adición a && y ; tiene || que es el opuesto de la &&: Sólo se ejecuta el comando, si el comando anterior no pudo con un no-cero estado de salida. Si el primer comando se ejecuta correctamente, la próxima no será ejecutado. Si falla, el próximo va a ser ejecutado.

Así que, en resumen:

  • &&: Ejecutar si el comando anterior terminó con 0
  • ;: Ejecutar de manera incondicional
  • ||: Ejecutar si el comando anterior terminó con una salida distinto de cero de estado.
  • &: Ejecutar comandos en paralelo, el primero en el fondo y la segunda en primer plano.

12voto

mook765 Puntos 693

El comando ls -lR terminó con una salida de estado diferente de cero, de modo que los comandos siguientes no han sido ejecutadas. La mayoría, probablemente, ls fue incapaz de abrir un subdirectorio. No sucedió en su primer comando porque no uso el -R-opción.

De man bash:

 comando1 && comando2
 command2 se ejecuta si, y sólo si, command1 devuelve un estado de salida
 de cero.

De man ls:

Estado de salida:
 0 si ACEPTAR,
 1 si los problemas de menor importancia (por ejemplo, no puede acceder a subdirectorio)
 2 en caso de problemas graves (por ejemplo, no puede tener acceso argumento de línea de comandos).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: