【问题标题】:Bash GUI programming: No/incorrect Zenity return value in bash scriptBash GUI 编程:bash 脚本中没有/不正确的 Zenity 返回值
【发布时间】:2019-04-16 23:10:07
【问题描述】:

我正在尝试使用 zenity 在 bash 脚本中从用户那里获取输入。 (Zenity 是一个 bash 可调用的 gui 工具包“东西”)

这是我目前的尝试

#!/bin/bash
if [[ true ]]
then
    # send a message to ask if data should be saved
    # do some form of copy to save the data
    zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No"
    rvar=$?
    #echo $rvar > /media/ramdisk/returnval
    if [[ $rvar == 0 ]]
    then
        DIR=$(zenity --file-selection --title="Ramdisk Unmount" --directory)
        CODE=$?
        echo $CODE
        echo $DIR
        case $CODE in
            0)
                echo "dir=$DIR"
                ;;
            1)
                echo "No directory selected"
                ;;
            -1)
                echo "An error occured"
                ;;
        esac
        echo $DIR
        echo $DIR > /media/ramdisk/dir
    else
        rm -rf /media/ramdisk/*
    fi    
    #umount /media/ramdisk
else
    false
fi
read -n1 -r -p "Press Enter to continue"

注意zenity版本是3.22.0

包括第一个 zenity 命令在内的前几行似乎可以正常工作,尽管在我尝试时很奇怪

rvar=`zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No"`

这似乎不起作用,并且

rvar=$(zenity --question --title="Ramdisk Unmount" --timeout=0 --text="Save ramdisk contants to disk?" --ok-label="Yes" --cancel-label="No")

似乎也没有按预期工作。 (在这两种情况下echo $rvar 都打印了一个空白行。)我认为这可能与我目前遇到的问题有关,即...

目前 bash 脚本似乎在第二个 zenity 命令之后终止。在 zenity 对话框中选择的路径被打印到(我假设是)stdout,但是没有进一步发生,脚本只是退出并返回到 bash 终端。

echo $CODE 没有打印任何代码。

echo $DIR 没有打印任何内容。

可能出了什么问题?

【问题讨论】:

  • 仅供参考,[[ true ]] 的行为与[[ false ]] 相同(因为不是空的,两个字符串都是真实的)。考虑while true 或其惯用的等价物while :; do,以避免给读者留下关于布尔值如何在shell 中工作的错误暗示。
  • @CharlesDuffy 两个好问题 - 至于第二个我不知道。如果我直接在 bash 终端中运行命令,它似乎可以工作。至于第一个,这暂时只是一个占位符 - 我应该删除这个 if 语句,但我认为这不是问题的原因?
  • 同意;如果我知道问题的原因,我会添加答案而不是评论。手头没有 zenity 可供测试,因此只是 kibitzing。
  • ...好吧,我安装了 zenity,并且至少可以确认您的一个观察结果 -- zenity --question 向标准输出写入任何内容,而是指定它的调用者仅通过退出状态选择了哪个布尔选项。
  • echo $CODE 打印 nothing,顺便说一句,这是一个很好的提示,CODE=$? 根本没有在您当前的上下文中运行。

标签: bash variables return-value zenity


【解决方案1】:

运行zenity --question 时,布尔响应仅通过退出状态指示;因此没有理由收集标准输出。

以下 Works For Me(tm),使用 Zenity 3.30.0:

if zenity --question --title="Ramdisk Unmount" --text="Save ramdisk contents to disk?"; then
  if dir=$(zenity --file-selection --title="Ramdisk Unmount" --directory); then
    echo "User requested unmount of the ramdisk at $dir" >&2
  else
    echo "User initially requested unmount but did not select a directory" >&2
  fi
else
  echo "User did not request unmount, or zenity failed" >&2
fi

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2012-08-30
    • 2019-10-03
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多