Это не определено tee, но, как говорит Daenyth, wc не будет завершен, пока tee не закончит передачу данных - так что обычно tee тоже будет передавать его в awk.В этом случае может быть лучше, чтобы awk сделал подсчет.
echo -ne {one,two,three,four}\\n | \
awk '{print "awk processing line " NR ": "$0} END {print "Awk saw " NR " lines"}'
Недостатком является то, что он не будет знать число до тех пор, пока не закончит (зная, что это требует буферизации данных).В вашем примере и tee, и wc имеют стандартный вывод, подключенный к одному каналу (стандартный ввод для awk), но порядок не определен.cat (и большинство других инструментов конвейеризации) можно использовать для сборки файлов в известном порядке.
Существуют более продвинутые методы конвейеризации, такие как bash-копроцессы (coproc) или именованные каналы (mkfifo или mknod).п).Последний получает ваши имена в файловой системе, которые могут быть переданы другим процессам, но вам придется их очистить и избежать коллизий.tempfile или $$ могут быть полезны для этого.Каналы не предназначены для буферизации данных, так как они часто имеют ограниченный размер и просто блокируют записи.
Пример, где каналы - неправильное решение:
mkfifo wcin wcout
wc -l < wcin > wcout &
yes | dd count=1 bs=8M | tee wcin | cat -n wcout - | head
Проблема здесь в том, что тройник застрянет, пытаясь написать что-то для cat, которая сначала хочет закончить с wcout.Просто слишком много данных для канала от тройника к коту.
Редактировать ответ dmckee: Да, порядок может быть повторяемым, но это не гарантируется.Это вопрос масштаба, планирования и размеров буфера.В этом окне GNU / Linux пример начинает разбиваться после нескольких тысяч строк:
seq -f line%g 20000 | tee >(awk '{print "*" $0 "*"}' ) | \
(awk '{print "this is awk: "$0}') | less
this is awk: line2397
this is awk: line2398
this is awk: line2*line1*
this is awk: *line2*
this is awk: *line3*