링크를 가져오기 위해 Python 파일을 사용하고 있지만 그렇게 하는 데 시간이 좀 걸리고 인쇄되며 33
일반적 66
으로 100
링크는 다음을 사용하여 stderr에 인쇄됩니다.sys.write.stderr(var)
이제 이 명령을 실행하고 싶습니다.python file.py | dialog --gauge "Doing stuffs" 10 35 0
stdout(업데이트 비율의 경우 33, 66, 100)을 파이프하여 변수에 대한 sterr을 측정하고 가져오고 싶습니다.
{
python3 file.py 2>&3 | dialog --gauge "Doing stuffs" 10 35 0;
} 3>&1
이 명령은 대화 상자를 올바르게 실행한 다음 stderr을 인쇄하지만 하위 쉘에서 실행하지 않으면 출력을 얻을 수 없습니다. 하지만 이렇게 하면 대화 상자가 사라집니다.
답변1
가장 쉬운 방법은 표준 오류를 파일에 저장한 다음 스크립트가 완료된 후 해당 파일의 내용을 변수에 할당하는 것입니다.
python file.py 2> ErrorFile | dialog --gauge "Doing stuffs" 10 35 0
MY_STDERR=$(<ErrorFile)
중간 파일을 사용하고 싶지 않다면 여기에 다른 방법이 있습니다.이 답변, 지침도 볼 수 있음):
{ MY_STDERR="$( { python file.py | dialog --gauge "Doing stuffs" 10 35 0; } 2>&1 1>&3 3>&- )"; } 3>&1;
답변2
백분율을 기록하는 이 함수 정의를 사용해 보겠습니다.표준 출력그리고 댓글표준 에러, 귀하의 프로그램에 대한 대안으로 python
:
thing() { for f in {10..100..10}; do sleep 0.5; echo "$f"; echo "Got $f" >&2; done; }
당신은 캡처할 수 있습니다표준 에러thing
여전히 렌더링된 기기를 사용한 출력:
{ info=$( ( thing 2>&4 | dialog --gauge 'Gauge' 10 40 0 >&3 ) 4>&1 ) ; } 3>&1
printf "GOT> %s\n" "$info"
여기서 우리는 thing
캡처합니다표준 에러도착하다FD 4dialog --gauge
, 임시 에서 출력을 다음으로 보냅니다 .FD 3. 변수를 할당한 $info
후FD 4우리는 리디렉션FD 3로 돌아가표준 출력. 최종 재할당이 필요하지 않은 경우 바깥쪽 중괄호를 제거하고 리디렉션하여 계측기 디스플레이를 열어 두어 표현식을 단순화할 수 있습니다.표준 에러:
info=$( ( thing 2>&4 | dialog --gauge 'Gauge' 10 40 0 >&2 ) 4>&1 )
printf "GOT> %s\n" "$info"
답변3
또 다른 옵션은 다음과 같습니다.
x=$( { dostuff |
dialog --gauge "Doing stuffs" 10 35 0 >/dev/tty 2>/dev/null; } 2>&1 )
여기,
- 진행률 표시줄의 표준 출력은
dialog
다른 것을 우회하여 터미널로 직접 리디렉션됩니다. - stderr가
dialog
전송되어/dev/null
거기에서 쓰레기를 잡지 않습니다. - 의 표준 출력은 평소와 같이 파이프로 연결됩니다
python
.dialog
- stderr는
python
명령 대체에 의해 제공되는 "stdout"으로 그룹 외부로 리디렉션되고 쉘에 의해 캡처됩니다.
물론 리디렉션이란 /dev/tty
전체 출력이 다른 곳으로 리디렉션되더라도 진행률 표시줄이 인쇄된다는 의미입니다. 이는 원하는 것일 수도 있고 아닐 수도 있습니다(그러나 출력된 터미널 제어 코드의 혼란은 dialog
터미널을 제외한 어느 곳에서나 매우 유용한 것일 수도 있고 아닐 수도 있습니다).
이렇게 하면 오류도 숨겨지지만 dialog
전체 할당의 종료 상태는 파이프라인의 마지막 명령의 종료 상태이므로 확인할 수 있습니다. 또는 set -o pipefail
파이프라인의 명령이 실패했는지 확인합니다.
테스트하려면 다음 스크립트를 사용하십시오 dostuff
.
#!/bin/bash
for x in 0 1 2 3 4 5; do
echo $((x * 20));
sleep .5;
done
echo "this is the result" >&2