How can I return to my bash prompt automatically after printing output from a function that was put in the background?
For example, when I run the following script in a bash shell:
fn(){ sleep 10 echo "Done" exit } fn &
After running the script, it immediately returns my prompt. After 10 seconds, it prints "Done" and then displays a blinking cursor on a new line:
$ Done ▏
The script isn't running anymore, but I don't get my prompt back until I press Return.
Is there any way to force a return to the bash prompt after printing "Done"?
A related question is: Is there a way for a backgrounded task to inform the terminal to print a new prompt? However, that question asks about a backgrounded program. The answer supplied there applies to a program that is sent to the background, but doesn't seem to work for a function that is sent to the background (as in the example I supplied).
To clarify: I am looking to save the entire code snippet above (e.g., as myscript.sh
) and then run it as a foreground script (e.g., as bash myscript.sh
).
EDIT: The above is of course just a MWE. The context of this problem is:
- User runs script
- Script submits PBS job, starts tailing the output file in the background, and calls
fn &
- User gets prompt back, may start doing other things.
- Job output appears on user's terminal when job starts running
fn
monitors the queue and killstail
when the job finishes.- Users complain about not getting prompt back (i.e., having to press Enter) after this finishes.
Here's some less minimal code:
watch_queue(){ until [ `qstat | grep $job | wc -l` -lt 1 ]; do sleep 2 done kill -9 $pid tput setaf 7 tput setab 0 echo "Hit ENTER to return to your command prompt." tput sgr0 exit 0 } cmd="something complicated that is built at runtime" outfile="ditto" queue="selected at runtime, too" job=`echo "cd \$PBS_O_WORKDIR && $cmd >> $outfile " | qsub -q $queue -e /dev/null -o /dev/null | awk 'BEGIN { FS="." } { print $1 }'` echo "Job $job queued on $queue: $cmd" eval "tail -f -F $outfile 2>/dev/null &" pid=$! watch_queue &
Of course it would be a lot easier for me if my users could just pick up the job output from a separate file, or manipulate jobs between foreground and background on their own, but they can't. They can't even follow the instructions in the script to hit Enter to get the "look" of a prompt back... And I can't open another "window" - they do not have a display server.
zsh
solution? Is it that you don't have the function defined in thezsh
environment? – Inventionzsh --version
reportszsh 5.0.2 (x86_64-pc-linux-gnu)
. I used thefn
exactly from the question, except with 3 instead of 10. – Inventionzsh
. If you execute the script file with.
(or equivalentlysource
), it seems to work as you expect. I tried a few differentzsh
options, but none seemed to help, and I'm not azsh
expert (or even fan). Good luck. – Inventionbash
answer, notzsh
- my users are flustered by not getting a prompt back, a new shell might make their heads explode :) I clarified my question, thanks for the suggestion. – Mckoy