나는 다음 명령 형식을 사용하고 있습니다.
cmd0 > >(cmd1) 2> >(cmd2)
Cmd2는 일부 데이터를 처리할 때 데이터를 zenity에 에코해야 하지만 zenity는 에코를 듣지 못합니다. cmd2가 에 의해 생성되었기 때문에 에코가 손실된 것 같습니다 (..)
. 아래에 내 코드 요약이 나와 있습니다. 사례 1과 3은 정상적으로 작동합니다. Zenity는 사례 2로부터 에코를 수신하지 않습니다. 데이터를 파일로 전송하여 사례 2가 올바르게 에코되는지 확인했습니다. 읽는 동안 데이터를 zenity에 에코하는 방법을 찾고 있습니다.
function() {
while [ "$nf" -lt "$num_of_files" ]; do
((nf=$nf+1))
case "$process" in
1)
while read -d$'\r' str1; do
(commands ... )
echo "$percent_update"
done
;;
2) #feed the standout of cmd0 to cmd1 and the standerr of cmd0 to cmd2
command0 > >(command1) 2> >(command 2 ....
while read -d$'%' str1; do
percent=$(echo "$str1" | sed 's/\x08//g' | sed 's/ //g')
percent=$(scaler "$percent" "$nf" "$num_of_files")
echo "$percent_update"
echo "$percent_update" >>just to verify data exists & is good.txt
done)
;;
3)
(more commands)
echo percent
;;
esac
done | zenity --progress --percentage=0 --auto-close
}
답변1
문제는 stderr을 리디렉션하고 있다는 것입니다.앞으로표준 출력을 리디렉션합니다. 전환하면 작동합니다. 이를 설명하기 위해 다음 스크립트를 고려하십시오. foo.sh
stderr 및 stdout으로 인쇄:
#!/usr/bin/env bash
## foo.sh
## Print "out" to standard output
echo out
## Print "error" to standard error
echo error >&2
bar.sh
입력 읽기:
#!/usr/bin/env bash
## bar.sh
read input
## Print your input
echo "bar.sh read: $input"
또한 이렇습니다 baz.sh
:
#!/usr/bin/env bash
## baz.sh
read input
## Print your input
echo "baz.sh read: $input"
이제 여러분이 하려는 것처럼 이 세 가지를 실행하고 출력을 loop 에 전달하면 while
예상대로 작동합니다.
$ foo.sh 2> >(bar.sh) > >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: error
baz.sh read: out
그러나 반대로 하면 실패합니다.
$ foo.sh > >(bar.sh) 2> >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: out
답변2
이것은 당신이 함께 묶은 매우 어리석은 리디렉션 체인입니다. 나는 당신이 실제로 무엇을 하려는지 이해하지 못하지만 문제의 원인을 확실히 오해하고 있습니다. 어쩌면 이것이 당신에게 아이디어를 줄 것입니다:
[mikeserv@desktop top]$ > >(sed 's/^/hey there:\t/') 2> >(ls -l /dev/fd/*)
ls: cannot access /dev/fd/10: No such file or directory
ls: cannot access /dev/fd/255: No such file or directory
ls: cannot access /dev/fd/3: No such file or directory
hey there: lr-x------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/0 -> pipe:[10484689]
hey there: l-wx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/1 -> pipe:[10484688]
hey there: lrwx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/2 -> /dev/pts/3
hey there: l-wx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/63 -> pipe:[10484688]
물론 루프의 stdout은 echo
작성되지 않습니다 while
. 명령의 파이프로 대체할 수 있습니다.command1
이렇게 하면 다음과 같은 내용을 읽을 수 있습니다.
> >(command1) 2> >(command2)
리디렉션은 순차적으로 처리됩니다(각 명령은 왼쪽에서 오른쪽으로). 모든 프로세스 교체는 영향을 미칩니다.같은 명령.
나는 당신이 정말로 하고 싶은 일이 다음에 더 가깝다고 확신합니다.
command0 | command1 2>&1 >/dev/null | command2