I'll agree with you there. The eval is unnecessary. But fn bt { eval '{'for {tail -f $i &} '}' } mimics how I would write it by hand. {tail -f file1 &; tail -f file2 &; tail -f file3 &}>file Which allows me to consider the command one block, which I can pipe to and from etc. The idiom that you and matt give doesn't work for pipes tail -f file1 &; tail -f file2 &; tail -f file3 >file only puts the text from file3 in the pipe. The for loop you gave obviates that problem, since it counts as a single block, but it's considerably different than my interactive shell usage and is more verbose(though much more readable :)). Noah