Как использовать fd вместо именованных каналов - PullRequest
6 голосов
/ 26 августа 2010

Я хочу взять стандартный процесс и проанализировать его с помощью трех разных программ. Я смог использовать именованные каналы, но могу ли я использовать вместо этого fd.

Вот что работает на данный момент:


exec 3< <(myprog)
tee p1 p2 >/dev/null <&3

cat p1|ap1 &
cat p2|ap2 &

p1 и p2 были созданы с помощью mkfifo. ap1 и ap2 - программы анализа. Я не знаю, правильно ли я это говорю, но есть ли способ вместо tee добавить два новых fd? Примерно так:


exec 3< <(myprog)
tee >&4 >&5 <&3

cat <&4|ap1 &
cat <&5|ap2 &

1 Ответ

5 голосов
/ 26 августа 2010

У вас почти было это:

myprog | tee >(ap1) >(ap2) >(ap3) >/dev/null

Обратите внимание, что ap1 может быть функцией.Если вы хотите, чтобы функция имела доступ к аргументу вашего скрипта, вызовите ее с "$@", то есть

ap1 () {
  # here the script arguments are available as $1, $2, ...
}
# ditto for ap2, ap3
myprog | tee >(ap1 "$@") >(ap2 "$@") >(ap3 "$@") >/dev/null

Если ваша оболочка не поддерживает >() (bash, ksh и zsh делают, ноэто не POSIX), но ваша ОС, тем не менее, поддерживает /dev/fd (большинство приложений, включая Solaris, Linux, * BSD, OSX и Cygwin), вы можете использовать явное перемешивание fd.

{ { { myprog | tee /dev/fd/3 /dev/fd/4 |
      ap1 >&2
    } 3>&1 |
    ap2 >&2
  } 4>&1 |
  ap3 >&2
}
...