【问题标题】:Simple console graphics, GUI or interface from a shell script?来自 shell 脚本的简单控制台图形、GUI 或界面?
【发布时间】:2011-05-28 04:56:23
【问题描述】:

我想通过做一些简单的类似ncurses 的控制台显示来美化 Bash shell 脚本的输出。

例如,我想显示一个百分比值随着某些活动的完成而增加。我可以通过在新行上输出每个百分比值来做到这一点,例如,

0%
1%
2%
... etc. ...

但我更希望文本更新到位(也就是说,脚本只写一行输出来显示百分比,然后该行上显示的百分比值会发生变化)。我知道我可以使用不同的脚本语言和 ncurses,但是是否有一个不会带来太多痛苦的 Bash 解决方案。最好,我想要在各种 Unix 上得到广泛支持的东西。

【问题讨论】:

    标签: bash shell ncurses


    【解决方案1】:

    输出\r 会将光标返回到第一列,以便您可以覆盖已经存在的文本。如果您需要比这更复杂的动作,tput 和各种 cu* 功能将允许您根据需要移动和放置光标。

    【讨论】:

    • 谢谢 ignacio。您能否详细说明 cu* 功能。我不知道那是什么。
    • 在 terminfo(5) 手册页中,它们是 cuf1(光标右)、cub1(光标左)、cuu1(光标向上)、cud1(光标向下)、和cup(光标移动)。有关详细信息,请参阅 tput(1) 手册页。
    【解决方案2】:

    为了全面的通用性和可移植性,这将是dialog 包。基本的ncurses 构建是高度可移植的;还有一个名为gdialog 的Gtk+ GUI 版本。然后,您不仅可以选择所描述的内容,还可以选择实际的进度条小部件。

    在更简单的方面,只需输出\r(使用printf 实用程序,或在较旧的商业Unix 上echo -n ...^M 或echo ... \r\c 之一)将让您覆盖一行。

    【讨论】:

    • 感谢极客。我看到了dialog,但它似乎没有默认安装在我的开发 Mac OS X 系统上。它在大多数 *nix'es 上是否默认可用?
    • +1 用于 printf。我不知道那存在。感谢您指出这一点。
    • 不,但它几乎无处不在。至于 OS X,MacPorts 中至少有它的三个变体(dialog、xdialog 和 zenity)。
    【解决方案3】:

    使用 ANSI 转义码来使用或着色您的光标。

    这里是 python 中的一个简短示例(使用 -u 标志运行它以表示无缓冲,否则您将看不到更新):

    #!/usr/bin/env python
    
    import time
    import sys
    
    for i in range (10):
        sys.stdout.write ('%d\x1b[1D' % i)
        time.sleep (1)
    

    CSInD ('\x1b[1D') 将光标向左移动 n 个位置。如果你想要一个彩色光标,只需打印例如'\x1b[1;31m'。适用于几乎所有的 shell。

    【讨论】:

    • 感谢 Hyperboreus。很高兴了解 ANSI 转义码选项,尽管对于 bash,我发现 tput 方法不那么晦涩。
    • @zlovelady。是的,对于这种情况,CSI 可能有点矫枉过正。但是当你想在控制台上做一些奇怪和令人眼花缭乱的事情时,记住 ANSI 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多