다음과 같은 인위적인 예에서 목적은 하위 명령만 제거하는 것입니다 /dev/tty
.
result="$(
tput smcup > /dev/tty
tput cup 0 0 > /dev/tty
echo 'meh' > /dev/tty
echo 'nay' > /dev/stderr
echo 'yay' > /dev/stdout
tput rmcup > /dev/tty
)"; echo "result=[$result]"
다음과 같이 출력됩니다.
result=[yay]
그러나 stderr은 nay
더 이상 디스플레이에 유지되지 않습니다. stderr이 계속 표시되도록 하려면 어떻게 해야 합니까? 출력은 다음과 같습니다
nay
result=[yay]
실제 사용 사례는 하위 명령이 사용자에게 일련의 질문을 하고 stdout에 대한 응답을 계산하고, 오류가 발생하면 오류를 stderr로 보내는 것입니다. 하위 명령이 완료되면 문제가 있는 상호 작용을 지우고, 표준 출력을 저장하고, 표준 오류를 표시하는 것이 목적입니다.
답변1
당신이에 쓰는 경우표준 에러값은 변수에 캡처되지 않습니다. 이 동작은 의도적으로 설계된 동작입니다. 그 중 하나를 유지하고 싶다면 nay
작성해야 합니다.표준 출력아니면 다시 열어야 해요표준 에러~처럼표준 출력(그것은 거의 같은 것입니다).
혼란을 줄이기 위해 이 동작은 tput smcup
terminfo 기능과 관련이 없습니다.
또한 입력된 유일한 값은 $result
기록된 출력입니다.표준 출력. 다른 모든 출력은 즉시 터미널에 기록됩니다. 이 단락은 다음과 같이 더 직접적으로 작성될 수 있습니다.
result='yay'
tput smcup
tput cup 0 0
echo 'meh'
echo 'nay'
tput rmcup
echo "result=[$result]"