Нет, нет, вышеприведённый код работает.
У меня была какая-то странная "интерференция" со
скриптом на питоне, но, по-видимому, bash не виноват.
Если интересно, то питоновский код выглядит так:
import sys
import time
sys.stdout.write('1\n')
sys.stderr.write('1\n')
i = 1
while True:
time.sleep(1)
i+=1
if i%2 == 0:
sys.stdout.write('%d\n' % i)
else:
sys.stderr.write('%d\n' % i)
В результате выполнения:
./test.py >> test.out 2>&1 &
в файле оказываются только нечётные цифры.
Оно даже так выводит: $ python ./test.py 2>&1 > /dev/null
Чую, питон там что-то с дескрипторами делает, поэтому такой косяк. Он там всякие dup, вроде, делает, наверно в этом проблема. Скорее всего где-нить в районе sys.stderr(Python/sysmodule.c, Python/pythonrun.c).
Замени sys.stdout на sys.__stdout__ и увидишь что заработает.
Вот не знаю на счёт коллизий, где-то про это было написано. Тут могут быть проблемы если stdout буферизирутся. stderr, вроде, не буферизируется, но я уже не помню.
Разница, скорее всего, в том что когда делаешь 2>&1 то дескриптор 2 это dup(1). Хотя я в этом не уверен, надо маны почитать.