¿Hay alguna manera de proporcionar tareas en serie en la terminal mientras se ejecuta una tarea (sin usar un archivo)?

14

Supongamos que hay 2 tareas t1, t2que se pueden ejecutar en serie de la siguiente manera:

t1 ; t2
# OR
t1 && t2

Ahora supongamos que olvidé correr t2y t1ya estoy corriendo; ¿Puedo agregar t2a la tubería para que se ejecute después de t1finalizar?

Abhimanyu Gupta
fuente

Respuestas:

19

Sí tu puedes:

  1. Pause el trabajo actualmente en ejecución con el carácter de suspensión presionando Ctrl+ Z.
  2. Escriba fgo %, agregue lo que desee a la lista y ejecútelo, por ejemplo:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Como fgdevuelve el valor de retorno del trabajo que reanudó, enumere los operadores como &&y ||trabaje como se esperaba:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL dice sobre el carácter de suspensión:

Al escribir el carácter de suspensión (normalmente ^Z, Control- Z) mientras se ejecuta un proceso, el proceso se detiene y se devuelve el control bash. (...) El usuario puede manipular el estado de este trabajo, utilizando el bgcomando para continuarlo en segundo plano, el fg comando para continuarlo en primer plano o el killcomando para eliminarlo. A ^Zsurte efecto de inmediato y tiene el efecto secundario adicional de provocar que se descarte la salida pendiente y la escritura anticipada.

fgse explica en man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Reanude jobspec en primer plano y conviértalo en el trabajo actual. Si jobspec no está presente, se utiliza la noción de shell del trabajo actual. El valor de retorno es el del comando colocado en primer plano, o falla si se ejecuta cuando el control de trabajo está deshabilitado o, cuando se ejecuta con el control de trabajo habilitado, si jobspec no especifica un trabajo válido o jobspec especifica un trabajo que se inició sin control de trabajo .

Lecturas adicionales (aparte de man bash) sobre el control del trabajo:

postre
fuente
+1 pero es una pena que esto no funcione cuando te olvidas t3de t1; t2; t3o t1 && t2 && t3.
JoL
@JoL Es cierto que, ^Z^Zy %-;%+;t3es lo suficientemente bueno en algunos casos, pero está lejos de ser una solución real al problema.
postre
2

Vi este método aquí: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

donde primero haces Ctrl+ zpara detener (suspender) el que está en ejecución y luego ejecutas el comando perdido de la siguiente manera: fg && ./missed_cmd.shy se ejecutará tan pronto como fgtermine.

El fg(comando en primer plano) pondrá en línea el trabajo suspendido y &&se asegurará de que el comando perdido solo se ejecute si el primer comando tiene éxito.

George Udosen
fuente