일반적으로 이는 하위 프로세스에서 기본 프로세스로 데이터를 전달하는 방법에 대한 질문이지만 zenity
몇 가지 추가 문제가 있을 수 있으므로 주의 깊게 살펴보세요 zenity
.
예:
#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
--title="Update System Logs" \
--text="Scanning mail logs..." \
--percentage=0
# ... here main process continues (x)
실제로 모든 단계가 실패할 수 있습니다(echo -- tar, md5 계산, 압축, 압축 풀기, 이름 지정 등). 예를 들어 ERR 변수를 일부 메시지로 설정하고 진행 하위 프로세스를 종료한 다음 내용을 표시하고 싶습니다. 오류가 발생하고 종료됩니다.
문제는 ERR이 지역 변수이기 때문에 하위 프로세스를 중단할 수 있지만 여전히 ERR을 외부로 전달할 수 없다는 것입니다. 또한 하위 프로세스가 실패했다는 사실을 인식하지 못한 채 기본 스크립트가 계속 진행되기 때문에 로컬로 표시할 수도 없습니다.
따라서 질문은 오류 코드, 메시지 또는 기타 항목을 기본 프로세스(지점 (x)에서 계속)에 어떻게 전달합니까?입니다.
프로세스 대안:
#!/bin/sh
zenity --progress \
--title="Update System Logs" \
--text="Scanning mail logs..." \
--percentage=0 < <(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
...
이것은 나에게도 작동하지 않습니다. 즉, 기본 스크립트에는 ERR이 표시되지 않습니다.
답변1
아마도 당신이 원하는 것은 PIPESTATUS입니다(man bash에서:).
An array variable (see Arrays below) containing a list of exit status
values from the processes in the most-recently-executed foreground pipeline
(which may contain only a single command).
답변2
이 문제를 해결했습니다.파비안이 제안하다(다시 한번 감사드립니다). 그러나 데이터 흐름의 전체 빌드에 만족하지 않습니다. 결국, Zenity는 내 작업의 진행 상황을 모니터링하도록 되어 있습니다. 단지 프로그램을 만족시키기 위해 전체 프로그램을 변경할 필요는 없습니다.
그래서 전체 작업 흐름을 변경했습니다. 먼저명명된 파이프Zenity에 진행 상황을 전달하기 위해 Zenity는 정상적으로(모니터로서) 작동합니다. 그래서 나는 전화한다:
(tail -f my_named_pipe) | zenity .... &
라벨이나 진행 상황을 설정하고 싶을 때 전화하면 됩니다.
echo "# We are cruising..." > my_named_pipe
진행 상황을 완료하면 Zenity에 "100"을 보냅니다. 이제 하위 프로세스가 없기 때문에 하위 프로세스에서 데이터를 전달하는 것에 대해 걱정할 필요 없이 기본 스크립트가 선형 방식으로 작동할 수 있습니다.