Запросить подтверждение пользователя перед выполнением сценария?

8

Есть ли способ получить диалоговое окно типа Подтверждение пользователя (например, вы уверены-да / нет), когда я выполняю сценарий (двойным щелчком мыши)? Я имею в виду не Терминал, а графическое окно подтверждения, что-то вроде этого: введите описание изображения здесь

(Я знаю, что изображение из окон, я не мог найти Linux)

майанк будхвани
источник

Ответы:

13

Есть способ использования zenity

zenity --question --text "Are you sure?"

введите описание изображения здесь

Вы можете проверить статус завершения этой команды с $?переменным, что - то вроде этого: if [ $? -eq 1 ];then exit 1 ; fi. 0есть OK, 1это отменить. Эта конструкция будет хорошо работать, если вам нужно проверить состояние выхода всплывающего окна позже, возможно, сохранить $?сразу после выхода всплывающего окна в переменную. Как обсуждалось в комментариях, структуры, подобные ниже, также будут работать:

if zenity --question --text "Are you sure" 
then
     runSumeFunction
else
     exit 1
 fi

или

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"
Сергей Колодяжный
источник
2
Вам не нужны квадратные скобки. Просто сделай if zenity...илиzenity... || exit
Кевин
Можно так, но я предпочитаю более «традиционный» стиль
Сергей Колодяжный
2
Мне просто показалось глупым проверить состояние завершения программы, передавая ее состояние завершения другой программе (или встроенной оболочке), а затем проверяя состояние выхода этой программы.
Кевин
Это несколько глупо, но стало привычкой
Сергей Колодяжный
6

Вы можете использовать xmessageв самом скрипте. Положите что-то вроде этого после "шебанга":

xmessage "Are you sure?"

Появится графическое сообщение «Вы уверены?» с кнопкой «хорошо».

Вы можете настроить xmessageболее одной кнопки и изменить то, что написано на ней. Вы также можете настроить действия, выполняемые каждой кнопкой.

Например,

xmessage -buttons ok:0,cancel:1 "Are you sure?"  

Смотрите man xmessageдля всех вариантов (их много).

Эдуардо Кола
источник
Спасибо ... Это решение также отлично работает .. Просто zenity отображает более
привлекательный
5

Вместо того, чтобы говорить вам, как это сделать, я скажу вам, что вы не должны этого делать.

TL; DR - не меняйте свой скрипт. Вместо этого настройте файловый менеджер или выясните, почему ваши пользователи случайно запустили его.

РЕДАКТИРОВАТЬ: Вы, кажется, относитесь к вашему сценарию как к чему-то особенному, как будто общие настройки недостаточно хороши, и ваш сценарий требует специального подтверждения от пользователя. Двойной щелчок по нему - подтверждение. Если вы обнаружите, что ваши пользователи запускают его случайно, вам нужно выяснить, почему они это делают, и решить это вместо этого. Тогда ваша настоящая проблема не в том, как запросить подтверждение, а в том, как предотвратить случайное его запускание пользователями.

Исходя из того, как вы раскрываете свою проблему, кажется, что вы ожидаете, что ваша программа (скрипт) будет запущена, перейдя туда, где находится файл, а затем щелкнув по нему в файловом менеджере. Подумайте обо всех других программах в вашей системе. Сколько ты начинаешь так? Вы переходите к /usr/local/binпри запуске Firefox? Конечно нет. Вы нажимаете на нее из меню приложений. (gnome tweak - это скрипт на python, может быть, это лучший пример)

Надеюсь, вы не сочтете нужным щелкнуть по нему из меню приложений. Таким образом, ваша проблема заключается в том, как заставить ваш скрипт появляться там вместо использования файлового менеджера. Для этого вы делаете следующие вещи:

  1. разместите свой сценарий отдельно от других файлов, где пользователь может случайно щелкнуть по нему (типичное место /usr/local/bin/для общесистемной установки или ~/.local/bin/для установки пользователем)

  2. создайте файл Desktop Entry (прочитайте стандартные спецификации ). Вот минимальный случай:

    [Desktop Entry]
    Name=Your script name
    Exec=path/for/your/script
    Icon=path/for/your/icon/can/be/svg
    Terminal=false
    Type=Application
    

    и засунь это в /usr/local/share/applications/your-script.xmlили ~/.local/share/your-script.xml.

  3. Наконец-то беги update-desktop-database.


Поскольку вы дважды щелкаете по сценарию, задача вашего файлового менеджера - подтвердить это. Сценарий не должен подтверждать, должен ли он выполняться. Возьми это до крайности. Можете ли вы представить, как это было бы смешно, когда каждый раз, когда вы вызывали какую-либо программу, вам приходилось это подтверждать?

Единственный раз, когда программа должна запросить подтверждение, это когда она собирается сделать что-то опасное и необратимое. Например, перезапись файла или обход корзины. И обратите внимание, что даже эти примеры о том, как заставить программу сделать что-то конкретное. Они не о запуске таких программ. Если единственная цель программы состоит в том, чтобы сделать такую ​​опасную вещь, то она также не должна спрашивать подтверждения.

Действительно, Nautilus (файловый менеджер Gnome) уже по умолчанию попросит вас подтвердить, хотите ли вы выполнить скрипт (или просто открыть его в текстовом редакторе).

Диалог подтверждения Nautilus

И, конечно же, это поведение настраивается, давая пользователю возможность отключить его (запись заметки в исполняемых текстовых файлах ).

Меню настроек Nautilus - вкладка «Поведение»

Так что не добавляйте раздражающий диалог подтверждения в ваш скрипт. Настройте ваш файловый менеджер правильно. И пусть ваши пользователи делают то же самое.

carandraug
источник
1
На самом деле это не решение, так как его нельзя легко и безопасно передать другим.
Исмаэль Мигель
Спасибо ... Я знаю, как это сделать ... Но это добавляет подтверждение ко всем сценариям ... Я хочу это для определенного сценария ...
mayank budhwani
@IsmaelMiguel, но в этом весь смысл ответа. Это не должно быть разделено. Есть две разные вещи, действие программы и поведение / опыт системы. Вы не должны объединять два.
carandraug
@IsmaelMiguel этот ответ указывает на то, что пользователь хочет делать. Это не дает рыбу спрашивающему, потому что у него аллергия.
Брайам
@mayankbudhwani вы все еще решаете не ту проблему. Почему этот конкретный сценарий особенный? Если ваши пользователи нажали на нее случайно, это другая проблема. Я отредактировал ответ другим подходом.
carandraug
2

Вы можете использовать yad, который походит на zenity на стероидах, поскольку это намного более настраиваемо. Вы можете установить его из Центра программного обеспечения в Ubuntu. В своей основной форме вы можете набрать

yad --title=Question --image=dialog-question --text="Are you sure?"

и вы должны увидеть это: скриншот 1

Если была нажата кнопка «ОК», мы получаем код возврата 0, а если была нажата кнопка «Отмена», мы получаем код возврата 1.

Было бы лучше поместить коробку в центр, а также отрегулировать ее ширину, используя ведущую вкладку, чтобы расположить текст «Вы уверены?» больше справа, а также всегда на вершине. Для этого нам нужно:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200

Большинство переключателей говорят сами за себя, за исключением «\ t» перед «Вы уверены?» который просто добавляет пробел перед печатью текста. Теперь мы должны увидеть это:введите описание изображения здесь

Коробка по центру, всегда сверху и выглядит лучше. Чтобы установить переменную для проверки, какая кнопка была нажата, используйте:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result

В этом примере мы используем переменную $ result, которая будет установлена ​​в 0, если была нажата OK, или в 1, если была нажата Cancel.

Для помощи с yad вы можете использовать man yadили, yad --help-allно я обнаружил, что практические примеры легче адаптировать. Есть некоторые здесь . Яд гораздо более настраиваемый и, следовательно, более полезный, чем zenity по моему мнению.

Скуби-2
источник
В случае, если это кому-нибудь поможет, я однажды опубликовал использование yad. Вы можете увидеть это здесь: askubuntu.com/questions/488350/…
Скуби-2