Возникают проблемы с перенаправлением 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)

В другом терминале я мог видеть эту родительскую / дочернюю иерархию:

  1. bash
    1. truss -eaf /usr/bin/perl -e printf "Test\n"; sleep 5
      1. /usr/bin/perl -e printf "Test\n"; sleep 5
      2. bash
        1. dd bs=1
          1. wc -l

truss ждет на корпусе, но dd не выйдет, пока не закроется его стандартный... так что они зашли в тупик.

~ truss -eaf -o >(some command) another command

... причины some command выполнить под текущей оболочкой так truss никогда не был его предком.

Я видел ту же иерархию в Linux, но она не тупиковая.

Другие вопросы по тегам