# test out %+, jobs -p, and $! agreement in a subshell first ${THIS_SH} ./jobs1.sub # test out fg/bg failure in a subshell ${THIS_SH} ./jobs2.sub # test out behavior of waiting for background pids -- bug in versions # before 2.03 ${THIS_SH} ./jobs3.sub # test out behavior of using job control notation when job control is not # active ${THIS_SH} ./jobs4.sub jobs echo $? # a no-such-job error, since we can use job control notation without job control wait %1 # make sure we can't fg a job started when job control was not active sleep 30 & pid=$! fg %1 # make sure the killed processes don't cause a message exec 5>&2 exec 2>/dev/null kill -n 9 $pid wait # make sure we reap the processes while stderr is still redirected exec 2>&5 echo wait-for-pid sleep 10 & wait $! echo wait-errors wait 1-1 wait -- -4 echo wait-for-background-pids sleep 5 & sleep 8 & wait echo async list wait-for-background-pids sleep 5 & sleep 8 & wait echo async list wait for child sleep 5 & echo forked wait echo wait-when-no-children wait set -m echo wait-for-job sleep 5 & wait %2 # this should be a no-such-job error echo $? wait %1 echo async list wait-for-job sleep 5 & echo forked wait %1 echo fg-bg 1 sleep 5 & %1 echo fg-bg 2 sleep 5 & fg %% echo fg-bg 3 sleep 5 & fg %s echo fg-bg 4 sleep 5 & fg %?ee # these next two are error cases echo fg-bg 5 sleep 15 & fg %2 # this should be a no-such-job error bg %1 # this should be a `bg background job?' error wait # these may someday mean to start the jobs, but not print the line # describing the status, but for now they are errors echo fg-bg 6 sleep 5 & fg -s %1 bg -s %1 wait # someday this may mean to disown all stopped jobs, but for now it is # an error disown -s # this is an error -- the job with the pid that is the value of $! is # retained only until a `wait' is performed disown %1 # this, however, is an error disown %2 echo wait-for-non-child wait 1 echo $? exit 1 | exit 2 | exit 3 echo $? -- ${PIPESTATUS[@]} -- ${PIPESTATUS[0]} - ${PIPESTATUS[1]} - ${PIPESTATUS[2]} sleep 300 & sleep 350 & sleep 400 & jobs echo running jobs: jobs -r # should be an error kill -n 1 %4 # should be an error jobs %4 echo current job: jobs %+ echo previous job: jobs %- kill -STOP %2 sleep 5 # give time for the shell to get the stop notification echo after kill -STOP echo running jobs: jobs -r echo stopped jobs: jobs -s disown %1 echo after disown jobs echo running jobs: jobs -r echo stopped jobs: jobs -s kill -s CONT %2 echo after kill -s CONT echo running jobs: jobs -r echo stopped jobs: jobs -s kill -STOP %3 sleep 5 # give time for the shell to get the stop notification echo after kill -STOP, backgrounding %3: bg %3 disown -h %2 # make sure the killed processes don't cause a message exec 5>&2 exec 2>/dev/null echo killing... kill -n 9 %2 %3 wait # make sure we reap the processes while stderr is still redirected echo done exec 2>&5 sleep 10 & kill -STOP %1 sleep 5 # give time for the shell to get the stop notification echo after KILL -STOP, foregrounding %1 fg %1 echo done