Сохранить количество строк, выводимых в переменную в сценарии оболочки, не потребляя выход

У меня есть сценарий оболочки, где у меня есть оператор if, основанный на выводе числа выходных строк, выводимых из другого вызова. (В моем случае сделать что-то есть больше, чем 1 строка вывода).

LINES=$(function_call | wc -l) if [ "$LINES" -gt 1 ] then do_stuff fi 

Однако я хотел бы не потреблять результат (т. Е. Все еще иметь его в stdout), но все же сценарий делает то же самое.

Используйте tee (здесь предполагается система с поддержкой /dev/fd/<n> ):

 { lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l) } 3>&1 if [ "$lines" -gt 1 ]; then do_stuff fi 

В Linux с нечетной реализацией /dev/fd/<n> , если stdout перенаправляется в файл, вывод будет вставлен в конец этого файла, даже если текущая позиция stdout в скрипте в этом файле а не в конце (в общем, это было бы нормально, хотя, как редко бывает, что stdout входит в файл).

В качестве альтернативы вы можете сделать

 { lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=') } 3>&1 

Или:

 { lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}') } 3>&1 

(остерегайтесь, что в зависимости от реализации sed или awk он может дать еще один, чем wc -l если function_call выводит дополнительные данные после последнего символа новой строки).