Возникают проблемы с перенаправлением stderr на подоболочку, созданную с заменой процесса
~ bash --version
GNU bash, version 3.2.51(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
Следующая команда работает как положено:
~ ls hdfhdfhdhfd 2> >(wc -l)
1
... но это не работает, и у меня заканчиваются идеи, чтобы выяснить, почему:
~ truss -eaf bash -c 'true' 2> >( some command to process text)
Команда внутри >()
заканчивает тем, что блокировал ожидание ввода.
Если я сделаю это вместо этого:
~ (true; truss -eaf bash -c 'true') 2> >( some command )
... это работает, как ожидалось, хотя это не работает:
~ ( truss -eaf bash -c 'true') 2> >( some command )
# ^^^^^ ... note the 1st command is missing
Если я сделаю some command
знак равно dd bs=1
, он потребляет и печатает весь текст фермы stderr
затем блоки.
Я не могу воспроизвести подобное поведение в Linux, только при использовании truss
в солярисе.
1 ответ
Основываясь на ответе @ccarton, я получил приблизительное представление о том, что происходит. Проиллюстрировать:
~ truss -eaf /usr/bin/perl -e 'print "Test\n"; sleep 5' 2> >(dd bs=1 | wc -l)
В другом терминале я мог видеть эту родительскую / дочернюю иерархию:
bash
truss -eaf /usr/bin/perl -e printf "Test\n"; sleep 5
/usr/bin/perl -e printf "Test\n"; sleep 5
bash
dd bs=1
wc -l
truss
ждет на корпусе, но dd
не выйдет, пока не закроется его стандартный... так что они зашли в тупик.
~ truss -eaf -o >(some command) another command
... причины some command
выполнить под текущей оболочкой так truss
никогда не был его предком.
Я видел ту же иерархию в Linux, но она не тупиковая.