다른 호출에 의해 출력된 숫자를 기반으로 줄을 출력하는 if 문이 있는 쉘 스크립트가 있습니다. (내 경우에는 어떤 작업을 수행하면 1줄 이상의 출력이 발생했습니다.)
LINES=$(function_call | wc -l)
if [ "$LINES" -gt 1 ]
then
do_stuff
fi
그러나 내가 원하는 것은 출력을 소비하는 것이 아니라(즉, 여전히 표준 출력에 표시되도록 하는 것) 스크립트가 동일한 작업을 수행하도록 하는 것입니다.
답변1
사용 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은 거의 위치하지 않으므로 이는 중요하지 않습니다.)~에문서 1개).
또는 다음을 수행할 수 있습니다.
{
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
( or 의 구현 에 따라 마지막 개행 문자 뒤에 추가 데이터를 출력하는 것 awk
보다 하나 더 많은 것을 제공할 수 있습니다 .)wc -l
function_call