5

I'm trying to write a command that's a one-line for loop containing a command that uses the & operator to put the command in the background:

for dir in $(ls); do command $dir &; done

Where & tells BASH to run command in the background. Yet BASH returns

bash: syntax error near unexpected token `;'

What's going on here? How can I use & in conjunction with ;? I tried enclosing things in quotes, like do "command $dir &" or do command $dir "&" but those have unexpected results.

Jonathan
  • 1,270
  • 3
    Beware using $(ls) in place of * is generally considered a bad practice. Because of the nature of globbing * will allow you to deal with filenames that contain whitespace, $(ls) will not. Consider a list of files, "one a", "one b", "two". With $(ls) you will iterate "one", "a" "one", "b", "two". With * you will iterate the actual file list. – goldilocks Jan 24 '14 at 22:49

1 Answers1

9

You don't use the ; with '&', the '&' on its own is enough to finish the command. I believe there is currently no mention of this behaviour in the manual. Your loop would simply be:

for dir in $(ls); do command $dir & done

Additionally, you should consider using a glob instead of $(ls) which will fail if the filename contains whitespace. You can set nullglob to prevent dir being a * if there are no files:

shopt -s nullglob
for dir in *; do command $dir & done
Graeme
  • 34,027
  • There's no mention because ;, &, &&, ||, and \n are all command separators, some of which have different meanings than others. – DopeGhoti Jan 24 '14 at 22:38
  • +1 for dir in $(ls); do command $dir ;; done will throw the same error, as will for f in $(ls); do echo $f |;done etc. – goldilocks Jan 24 '14 at 22:39