YAD按钮可以调用脚本中的函数吗?

时间:2018-04-09 17:09:13

标签: bash yad

我正在玩BASH中的YAD对话框,但是按钮构造有问题。我无法使用YAD按钮在同一个脚本中调用函数。有没有办法做到这一点?

我的理解是如果我使用以下结构,按下按钮将调用冒号后面的命令如果用户单击打开浏览器按钮:

yad --button="Open browser":firefox

我有一个包含多个BASH函数的脚本。我想按一下按钮来调用其中一个功能。它没有。以下是一个简单的脚本,在运行时,演示了令人失望的行为:

#!/bin/bash,

click_one()
{
   yad --center --text="Clicked the one"
}

click_two()
{
   yad --center --text="Clicked the two"
}

cmd="yad --center --text=\"Click a button to see what happens\" \
      --button=\"One\":click_one \
      --button=\"Two\":2 \
      --button=\"Date\":date \
      --button=\"Exit\":99"

proceed=true

while $proceed; do
    eval "$cmd"
    exval=$?

    case $exval in
        2) click_two;;
        99) proceed=false;;
    esac
done

在上面的代码中,按钮 Date 按预期工作,调用 date 命令。按钮两个退出是有效的,因为我检查命令的退出值并对其值进行分支。可悲的是(对我而言),按钮 One 什么都不做。我曾希望点击按钮 One 会调用本地函数 click_one 。我想知道是否有一种格式化YAD命令的方法,以便调用 click_one 函数。

虽然上面的代码建议使用退出值的解决方法,但我的真正目标是将一个成功的答案应用于表单按钮,据我所知,到目前为止,该表单按钮不会返回退出值。换句话说,以下内容也会无声地失败,但我希望它能够调用函数 click_one

yad --form --field="One":fbtn click_one

2 个答案:

答案 0 :(得分:1)

显然不是,它需要是一个实际的命令。

您可以:将您的函数放在一个单独的文件中,并作为命令启动bash,获取该文件并调用该函数。

在这里,我还要重构代码以将yad命令存储在数组中。这将使您的脚本更加健壮:

# using an array makes the quoting a whole lot easier
cmd=(
    yad --center --text="Click a button to see what happens" 
      --button="One":"bash -c 'source /path/to/functions.sh; click_one'"
      --button="Two":2 
      --button="Date":date 
      --button="Exit":99
)

while true; do
    "${cmd[@]}"      # this is how to invoke the command from the array
    exval=$?
    case $exval in
        2) click_two;;
        99) break;;
    esac
done

答案 1 :(得分:1)

一种可能的方式:

#!/bin/bash


click_one(){
   yad --center --text="Clicked the one"
}

click_two(){
   yad --center --text="Clicked the two"
}

export -f click_one click_two

yad \
    --title "My Title" \
    --center --text="Click a button to see what happens" \
    --button="One":"bash -c click_one" \
    --button="Two":"bash -c click_two" \
    --button="Date":"date" \
    --button="Exit":0


echo $?