我正在使用 python 文件来抓取链接,但要做到这一点需要一些时间,它会打印33
,66
并且100
通常使用打印到 stderr 的链接sys.write.stderr(var)
现在,我想运行这个命令python file.py | dialog --gauge "Doing stuffs" 10 35 0
并希望通过管道输出标准输出(33、66、100 用于更新百分比)来衡量并将 sterr 转换为变量。
{
python3 file.py 2>&3 | dialog --gauge "Doing stuffs" 10 35 0;
} 3>&1
此命令正确运行对话框,然后打印 stderr,但我无法获取其输出,除非它在子 shell 中运行。但是这样做会使对话框消失。
最简单的方法是将标准错误存储到文件中,然后在脚本完成后将此文件的内容分配给变量。
如果您不想使用中间文件,这是另一种方式(取自此答案,您还可以在其中看到解释):
让我们使用这个函数定义,它将百分比写入stdout并将注释写入stderr,作为
python
程序的替代替代品:您可以在仍然显示仪表的同时捕获stderr输出:
thing
这里我们将
thing
's stderr捕获到fd 4,并将输出从dialog --gauge
临时发送到fd 3。$info
从fd 4分配变量后,我们将fd 3重定向回stdout。如果您不需要最后的重新分配,您可以通过删除外部花括号和重定向来简化表达式,将仪表显示在stderr上:另一种选择是这样的:
这里,
dialog
被直接重定向到终端绕过其他任何东西dialog
被发送到,/dev/null
所以我们不会从那里捕获任何垃圾python
并且dialog
python
被重定向(在组外)到命令替换提供的“stdout”,并被 shell 捕获当然,重定向到
/dev/tty
意味着即使整个事物的输出被重定向到其他地方,也会打印进度条。这可能是也可能不是您想要的(但是dialog
输出的终端控制代码的混乱也可能不是在终端以外的任何地方都非常有用的东西)。这也将隐藏任何错误
dialog
,但整个分配的退出状态是管道中最后一个命令的退出状态,因此您可以检查它。或用于set -o pipefail
查看管道中的任一命令是否失败。用这样的脚本测试
dostuff
: