Ответы:
Есть способ использования 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:/"
Вы можете использовать xmessage
в самом скрипте. Положите что-то вроде этого после "шебанга":
xmessage "Are you sure?"
Появится графическое сообщение «Вы уверены?» с кнопкой «хорошо».
Вы можете настроить xmessage
более одной кнопки и изменить то, что написано на ней. Вы также можете настроить действия, выполняемые каждой кнопкой.
Например,
xmessage -buttons ok:0,cancel:1 "Are you sure?"
Смотрите man xmessage
для всех вариантов (их много).
Вместо того, чтобы говорить вам, как это сделать, я скажу вам, что вы не должны этого делать.
TL; DR - не меняйте свой скрипт. Вместо этого настройте файловый менеджер или выясните, почему ваши пользователи случайно запустили его.
РЕДАКТИРОВАТЬ: Вы, кажется, относитесь к вашему сценарию как к чему-то особенному, как будто общие настройки недостаточно хороши, и ваш сценарий требует специального подтверждения от пользователя. Двойной щелчок по нему - подтверждение. Если вы обнаружите, что ваши пользователи запускают его случайно, вам нужно выяснить, почему они это делают, и решить это вместо этого. Тогда ваша настоящая проблема не в том, как запросить подтверждение, а в том, как предотвратить случайное его запускание пользователями.
Исходя из того, как вы раскрываете свою проблему, кажется, что вы ожидаете, что ваша программа (скрипт) будет запущена, перейдя туда, где находится файл, а затем щелкнув по нему в файловом менеджере. Подумайте обо всех других программах в вашей системе. Сколько ты начинаешь так? Вы переходите к /usr/local/bin
при запуске Firefox? Конечно нет. Вы нажимаете на нее из меню приложений. (gnome tweak - это скрипт на python, может быть, это лучший пример)
Надеюсь, вы не сочтете нужным щелкнуть по нему из меню приложений. Таким образом, ваша проблема заключается в том, как заставить ваш скрипт появляться там вместо использования файлового менеджера. Для этого вы делаете следующие вещи:
разместите свой сценарий отдельно от других файлов, где пользователь может случайно щелкнуть по нему (типичное место /usr/local/bin/
для общесистемной установки или ~/.local/bin/
для установки пользователем)
создайте файл 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
.
Наконец-то беги update-desktop-database
.
Поскольку вы дважды щелкаете по сценарию, задача вашего файлового менеджера - подтвердить это. Сценарий не должен подтверждать, должен ли он выполняться. Возьми это до крайности. Можете ли вы представить, как это было бы смешно, когда каждый раз, когда вы вызывали какую-либо программу, вам приходилось это подтверждать?
Единственный раз, когда программа должна запросить подтверждение, это когда она собирается сделать что-то опасное и необратимое. Например, перезапись файла или обход корзины. И обратите внимание, что даже эти примеры о том, как заставить программу сделать что-то конкретное. Они не о запуске таких программ. Если единственная цель программы состоит в том, чтобы сделать такую опасную вещь, то она также не должна спрашивать подтверждения.
Действительно, Nautilus (файловый менеджер Gnome) уже по умолчанию попросит вас подтвердить, хотите ли вы выполнить скрипт (или просто открыть его в текстовом редакторе).
И, конечно же, это поведение настраивается, давая пользователю возможность отключить его (запись заметки в исполняемых текстовых файлах ).
Так что не добавляйте раздражающий диалог подтверждения в ваш скрипт. Настройте ваш файловый менеджер правильно. И пусть ваши пользователи делают то же самое.
Вы можете использовать yad, который походит на zenity на стероидах, поскольку это намного более настраиваемо. Вы можете установить его из Центра программного обеспечения в Ubuntu. В своей основной форме вы можете набрать
yad --title=Question --image=dialog-question --text="Are you sure?"
Если была нажата кнопка «ОК», мы получаем код возврата 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 по моему мнению.
if zenity...
илиzenity... || exit