Тройник только для команд, а не stdout - PullRequest
1 голос
/ 05 апреля 2019

Я уже знаю, как использовать tee с подстановкой процесса для отправки вывода на различные команды, и стандартный вывод, например,

command0 | tee >(command1) >(command2)

В приведенной выше строке stdout будет состоять из чередующихся строк из command0, command1 и command2.

Есть ли способ запретить tee писать в stdout, не удаляя вывод команд, к которым он направляет? Так что для вышеприведенного примера, для stdout иметь только выходные данные из command1 и command2? Большинство ответов, касающихся tee без stdout, пишутся только в файлы, и рекомендуется использовать что-то вроде этого:

command0 | tee file1 file2 >/dev/null

Но с подстановкой процесса это будет также потреблять весь вывод других команд.

command0 | tee >(command1) >(command2) >/dev/null

Есть ли какой-нибудь способ сказать tee не печатать на стандартный вывод или использовать только вывод непосредственно из tee?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Попробуйте это:

( command0 | tee >(command1 1>&3 ) | command2 ) 3>&1

Он перенаправляет стандартный вывод команды command1 на канал 3, так что команда2 видит только исходный источник. В конце вы снова перенаправляете канал 3 на стандартный вывод.

Используйте это, чтобы проверить это:

( echo test | tee >( sed 's/^/1 /' >&3 )  | sed 's/^/2 /' ) 3>&1

Выход неупорядочен и в моем случае:

2 test
1 test
1 голос
/ 05 апреля 2019

Я видел комментарий и ответ , которые используют дополнительные >, но на самом деле не объясняют, почему он делает то, что делает. Кажется, что он перенаправляет вывод куда-то , но все, что я могу пока сказать, это то, что он делает то, что я ищу. Это работает:

command0 | tee > >(command1) >(command2)
command0 | tee >(command1) > >(command2)

Похоже, что не имеет значения, где находится дополнительный >, пока он находится перед хотя бы одним из аргументов tee. Так что это не сработает:

command0 | tee >(command1) >(command2) >

Не зная, как это называется, и без дальнейших указаний я не могу объяснить дальше.

...