zenityの進捗状況を得るためにプロセスの外部にデータを渡す方法は?

zenityの進捗状況を得るためにプロセスの外部にデータを渡す方法は?

通常、これは子プロセスから基本プロセスにデータを渡す方法についての質問ですが、いくつかの追加の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」を送信します。これで、子プロセスがないため、子プロセスからデータを渡すことを心配することなく、基本スクリプトが直線的に動作できるようになります。

関連情報