Может ли кнопка YAD вызвать функцию в скрипте?
Я играю с диалогами YAD в BASH и у меня проблемы с конструкцией кнопок. Я не могу получить кнопку YAD для вызова функции в том же сценарии. Есть ли способ сделать это?
Насколько я понимаю, если я использую следующую конструкцию, нажатие кнопки вызовет команду, которая следует за двоеточием. Этот пример (который работает) откроет экземпляр 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. Кнопки Два и Выход работают, потому что я проверяю выходное значение команды и разветвляюсь на ее значение. К сожалению (для меня), кнопка Один ничего не делает. Я надеялся, что нажатие на кнопку One вызовет локальную функцию click_one. Я хотел бы знать, есть ли способ отформатировать команду YAD, чтобы вызывать функцию click_one.
Хотя приведенный выше код предлагает обходной путь, использующий значение выхода, моя настоящая цель - применить успешный ответ к кнопке формы, которая, насколько я могу судить до сих пор, не возвращает значение выхода. Другими словами, следующее также молча терпит неудачу, но я бы хотел, чтобы оно вызывало функцию click_one:
yad --form --field="One":fbtn click_one
2 ответа
Очевидно нет, это должна быть реальная команда.
Вы могли бы: поместить свои функции в отдельный файл и в качестве команды запустить 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 $?