YAD 按钮可以调用脚本中的函数吗?
Can a YAD button invoke a function within a script?
我正在 BASH 中使用 YAD 对话框,但在按钮构造方面遇到了问题。我无法获得 YAD 按钮来调用同一脚本中的函数。有办法吗?
我的理解是,如果我使用以下构造,按下按钮将调用冒号后面的命令如果用户单击 Open,此示例(有效)将打开 Firefox 实例浏览器 按钮:
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 命令。按钮 Two 和 Exit 起作用是因为我正在检查命令的退出值并根据其值进行分支。可悲的是(对我来说),按钮 One 什么都不做。我曾希望单击按钮 One 会调用本地函数 click_one。我想知道是否有一种方法可以格式化 YAD 命令,以便调用 click_one 函数。
虽然上面的代码建议使用退出值的解决方法,但我的真正目标是将成功的答案应用到表单按钮,据我所知,目前还没有 return一个退出值。换句话说,以下也无声地失败,但我希望它调用函数 click_one:
yad --form --field="One":fbtn click_one
显然不是,它需要是一个实际的命令。
您可以:将您的函数放在一个单独的文件中,作为命令,启动 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
一种可能的方式:
#!/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 $?
我正在 BASH 中使用 YAD 对话框,但在按钮构造方面遇到了问题。我无法获得 YAD 按钮来调用同一脚本中的函数。有办法吗?
我的理解是,如果我使用以下构造,按下按钮将调用冒号后面的命令如果用户单击 Open,此示例(有效)将打开 Firefox 实例浏览器 按钮:
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 命令。按钮 Two 和 Exit 起作用是因为我正在检查命令的退出值并根据其值进行分支。可悲的是(对我来说),按钮 One 什么都不做。我曾希望单击按钮 One 会调用本地函数 click_one。我想知道是否有一种方法可以格式化 YAD 命令,以便调用 click_one 函数。
虽然上面的代码建议使用退出值的解决方法,但我的真正目标是将成功的答案应用到表单按钮,据我所知,目前还没有 return一个退出值。换句话说,以下也无声地失败,但我希望它调用函数 click_one:
yad --form --field="One":fbtn click_one
显然不是,它需要是一个实际的命令。
您可以:将您的函数放在一个单独的文件中,作为命令,启动 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
一种可能的方式:
#!/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 $?