Suppose there are 2 tasks
t2 which can be executed in a serial way as below:
t1 ; t2 # OR t1 && t2
Now suppose I forgot to run
t1 is already running; can I add
t2 to the pipeline so that it gets executed after
Yes you can:
%, add what you want to the list and execute it, e.g.:
fg ; systemctl suspend # or % ; systemctl suspend
fgreturns the return value of the job it resumed, list operators like
||work as expected:
fg && echo "Finished successfully!" # or % && echo "Finished successfully!"
man bash/JOB CONTROL says about the suspend character:
Typing the suspend character (typically
^Z, Control-Z) while a process is running causes that process to be stopped and returns control to
bash. (…) The user may then manipulate the state of this job, using the
bgcommand to continue it in the background, the
fgcommand to continue it in the foreground, or the
killcommand to kill it. A
^Ztakes effect immediately, and has the additional side effect of causing pending output and typeahead to be discarded.
fg is explained in
man bash/SHELL BUILTIN COMMANDS:
Resume jobspec in the foreground, and make it the current job. If jobspec is not present, the shell's notion of the current job is used. The return value is that of the command placed into the foreground, or failure if run when job control is disabled or, when run with job control enabled, if jobspec does not specify a valid job or jobspec specifies a job that was started without job control.
Further reading (aside from
man bash) on job control:
where you first do Ctrl+z to stop (suspend) the running one then you run the missed command like so:
fg && ./missed_cmd.sh and it will run as soon as the
fg (foreground command) will bring the suspended job online and the
&& will ensure that the missed command is only run if the first command succeeds.