That "Done" message is because the shell has the command still under its job control:
$ sleep 10 & [1] 660 $ jobs [1]+ Running sleep 10 & (time passes) $ [1]+ Done sleep 10
You can simply remove all jobs from job control with disown
(a)
$ sleep 100 & [1] 3804 $ jobs [1]+ Running sleep 100 & $ disown $ jobs $
I don't know a method to disown a job right with its start(b), so I propose that you simply put a disown
to your bashrc, right after the sound command. However this will disown all jobs -- I don't know if this is wanted. Otherwise you can use disown %aplay
.
(a) man bash
disown [-ar] [-h] [jobspec ...] Without options, each jobspec is removed from the table of active jobs. If jobspec is not present, and neither -a nor -r is supplied, the shell's notion of the current job is used. If the -h option is given, each jobspec is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is present, and neither the -a nor the -r option is supplied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs. The return value is 0 unless a jobspec does not specify a valid job.
(b) However, in the Z Shell zsh
this is easy:
zsh$ sleep 10 &! zsh$ jobs zsh$