![如何将数据传递到进程外部以获得 zenity 进度?](https://linux22.com/image/48533/%E5%A6%82%E4%BD%95%E5%B0%86%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92%E5%88%B0%E8%BF%9B%E7%A8%8B%E5%A4%96%E9%83%A8%E4%BB%A5%E8%8E%B7%E5%BE%97%20zenity%20%E8%BF%9B%E5%BA%A6%EF%BC%9F.png)
通常这将是一个关于如何将数据从子进程传递到主进程的问题,但可能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”。这允许我的主脚本以线性方式工作,而不必担心从子进程传递数据,因为现在没有子进程。