如何将数据传递到进程外部以获得 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 是局部变量,所以我可以中断子进程,但仍然无法将 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”。这允许我的主脚本以线性方式工作,而不必担心从子进程传递数据,因为现在没有子进程。

相关内容