首页 > 解决方案 > Bash GUI 编程:bash 脚本中没有/不正确的 Zenity 返回值

问题描述

我正在尝试使用 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

可能出了什么问题?

标签: bashvariablesreturn-valuezenity

解决方案


运行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

推荐阅读