LINUX.ORG.RU

Ответ на: комментарий от fizteh

Нет, нет, вышеприведённый код работает.

У меня была какая-то странная "интерференция" со
скриптом на питоне, но, по-видимому, 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 &

в файле оказываются только нечётные цифры.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

Оно даже так выводит: $ python ./test.py 2>&1 > /dev/null
Чую, питон там что-то с дескрипторами делает, поэтому такой косяк. Он там всякие dup, вроде, делает, наверно в этом проблема. Скорее всего где-нить в районе sys.stderr(Python/sysmodule.c, Python/pythonrun.c).

Замени sys.stdout на sys.__stdout__ и увидишь что заработает.

Воркэраунд:
python ./test.py > /tmp/test_output 2>/tmp/test_output

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

>python ./test.py > /tmp/test_output 2>/tmp/test_output

Ух ты, удивительно. А не будет коллизий? И в чём разница?

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

Вот не знаю на счёт коллизий, где-то про это было написано. Тут могут быть проблемы если stdout буферизирутся. stderr, вроде, не буферизируется, но я уже не помню.

Разница, скорее всего, в том что когда делаешь 2>&1 то дескриптор 2 это dup(1). Хотя я в этом не уверен, надо маны почитать.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.