출력을 사용하지 않고 출력 줄 수를 쉘 스크립트의 변수에 저장

출력을 사용하지 않고 출력 줄 수를 쉘 스크립트의 변수에 저장

다른 호출에 의해 출력된 숫자를 기반으로 줄을 출력하는 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 -lfunction_call

관련 정보