【问题标题】:Installer on bash: how to show GUI messages?bash 上的安装程序:如何显示 GUI 消息?
【发布时间】:2015-06-10 22:05:33
【问题描述】:

我想创建一个简单的 .sh 脚本,该脚本将在我的程序中包含二进制包并将其复制到目标文件夹。在安装期间,我想显示 gui 消息以通知用户一切正常。从这个问题看来,我需要How to show a GUI message box from a bash script in linux? 但是如何用我的单个 .sh 脚本来提供它? (用户应该从任何地方运行安装程序,无需任何额外操作)。最常见的 linux 发行版是否有通用的东西?也许是“xmessage”,但它看起来很差。还有什么?

【问题讨论】:

  • 为什么要这样做?这违反了 linux 系统上的软件管理系统引入的所有良好实践。为什么不使用包管理而不是创建自己的安装程序?没有理智的系统管理员会相信它。除此之外,在任何 linux 发行版中使用现有的包管理系统都更加舒适和安全。
  • 包管理在不同的发行版中有所不同,我不知道哪些发行版会使用我的用户,并且创建所有可能的包对于我的小程序来说似乎是不合理的。而且这个程序不适合系统管理员。此外,对于我的嵌入式专业,我经常使用带有通用安装程序(例如 Xilinx ISE webpack 和 Quartus)的专有 linux 程序,并且在 Ubuntu 和我的 ArchLinux 发行版上都运行良好。
  • 我从不质疑这种自定义安装程序的工作原理。我说没有理智的管理员会使用它们,因为没有办法知道它们对系统做了什么。为什么要将自己系统的全部管理权交给一个不认识、不知道他的动机的人?没有那么多的包格式,实际上只有 2 或 3 种比较普遍。看看opensuse 的OpenBuildService。它允许您为许多发行版创建干净的包,甚至提供下载存储库。再舒服不过了……

标签: bash user-interface


【解决方案1】:

诸如 xmessage 或 zenity 或 gxmessage 之类的任何内容都意味着您无法保证可用的外部依赖项(除非您可以;您在问题中没有这么说)。要回答您的一个问题,,Linux 没有什么通用的。当然不是任何依赖于 X 的东西,因为很多 Linux 安装都是无头的。

对于“其他东西”,作为一般原则,独立是一个好主意。这意味着使用一些甚至不依赖于 X Window 系统的东西。无论您是在FreeBSD 还是Linux,都可以随时使用基于Shell 的对话框。

要真正独立且可移植(即使在不同的 Linux 发行版或不同的服务器配置之间),我建议将您自己的对话管理器编写为您的 shell 脚本中的一个函数。类似这样的东西:

#!/usr/bin/env bash

# A supporting function to see test a value against the contents of an array
is_in() {
  value=$1; shift
  for i in "$@"; do [[ $i == $value ]] && return 0; done
  return 1
}

# Simple dialog implementation, no VT100 required,
dialog() {
  # $options is an array of options
  local i line max=0
  # determine dialog width
  for line in "${options[@]}"; do [[ ${#line} -gt $max ]] && max=${#line}; done
  # draw a line
  eval printf '%.s-' {1..$((max+8))}; echo
  # print each option
  for i in ${!options[@]}; do
    printf "| %2d: %-${max}s |\n" "$i" "${options[i]}"
  done
  eval printf '%.s-' {1..$((max+8))}; echo
  response=""
  # only accept valid responses
  while ! is_in "$response" "${!options[@]}"; do
    read -p "  Choose: " response
  done
  return "$response"
}

# Create our list, run the dialog, capture the result,
options=([1]="Hello world" [2]="This is a test")
dialog
result=$?

# And display the result.
echo "RESPONSE: $result / ${options[$result]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 2010-09-05
    • 1970-01-01
    • 2011-05-10
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多