Может ли кнопка 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 $?
Другие вопросы по тегам