Câu trả lời:
Có một cách sử dụng zenity
zenity --question --text "Are you sure?"
Bạn có thể kiểm tra trạng thái thoát của lệnh đó bằng $?
biến, đại loại như thế này : if [ $? -eq 1 ];then exit 1 ; fi
. 0
là OK
, 1
là hủy bỏ. Cấu trúc này sẽ hoạt động tốt nếu bạn cần kiểm tra trạng thái thoát của cửa sổ bật lên sau đó, có thể lưu trữ $?
ngay sau khi cửa sổ bật lên thoát ra một biến. Như đã thảo luận trong các ý kiến, các cấu trúc như dưới đây cũng sẽ hoạt động:
if zenity --question --text "Are you sure"
then
runSumeFunction
else
exit 1
fi
hoặc là
zenity --question --text "Are you sure?" || echo "User isn't sure:/"
Bạn có thể sử dụng xmessage
trong chính kịch bản. Đặt một cái gì đó như thế này sau "shebang":
xmessage "Are you sure?"
Điều này sẽ hiển thị một thông báo đồ họa có nội dung "Bạn có chắc không?" với nút "được".
Bạn có thể định cấu hình xmessage
để có nhiều hơn một nút và thay đổi những gì được viết trong đó. Bạn cũng có thể định cấu hình các hành động được thực hiện bởi mỗi nút.
Ví dụ,
xmessage -buttons ok:0,cancel:1 "Are you sure?"
Xem man xmessage
cho tất cả các tùy chọn (có rất nhiều trong số họ).
Thay vì nói với bạn cách làm, tôi sẽ nói với bạn rằng bạn không nên làm điều đó.
TL; DR - Không thay đổi tập lệnh của bạn. Thay vào đó hãy định cấu hình trình quản lý tệp của bạn hoặc tìm hiểu lý do tại sao người dùng của bạn vô tình chạy nó.
EDIT: Bạn dường như coi tập lệnh của mình là một cách đặc biệt, như thể các cài đặt chung không đủ tốt và tập lệnh của bạn cần xác nhận đặc biệt từ người dùng. Nhấp đúp chuột vào nó là xác nhận. Nếu bạn thấy rằng người dùng của bạn chạy nó một cách tình cờ thì bạn phải tìm ra lý do tại sao họ làm điều đó và giải quyết điều đó thay vào đó. Sau đó, vấn đề thực sự của bạn không phải là làm thế nào để yêu cầu xác nhận mà là làm thế nào để ngăn người dùng của bạn chạy nó một cách tình cờ.
Từ cách bạn phơi bày vấn đề của mình, có vẻ như bạn mong đợi chương trình (tập lệnh) của mình sẽ được chạy bằng cách điều hướng đến vị trí của tệp, sau đó nhấp vào nó từ trình quản lý tệp. Hãy suy nghĩ về tất cả các chương trình khác trong hệ thống của bạn. Có bao nhiêu bạn bắt đầu như vậy? Bạn có điều hướng đến /usr/local/bin
khi bắt đầu firefox? Tất nhiên là không. Bạn bấm vào nó từ menu ứng dụng. (tinh chỉnh gnome là một kịch bản python có lẽ đó là một ví dụ tốt hơn)
Hy vọng rằng bạn sẽ không coi việc nhấp vào nó từ menu ứng dụng là một tai nạn. Vì vậy, vấn đề của bạn trở thành làm thế nào để làm cho tập lệnh của bạn xuất hiện ở đó thay vì sử dụng trình quản lý tệp. Để làm điều này, bạn làm những điều sau đây:
đặt tập lệnh của bạn ra khỏi các tệp khác mà người dùng có thể nhấp vào tập lệnh một cách tình cờ (vị trí điển hình là /usr/local/bin/
cài đặt toàn hệ thống hoặc cài đặt ~/.local/bin/
cho người dùng)
tạo tập tin Desktop Desktop (đọc thông số kỹ thuật tiêu chuẩn ). Đây là một trường hợp tối thiểu:
[Desktop Entry]
Name=Your script name
Exec=path/for/your/script
Icon=path/for/your/icon/can/be/svg
Terminal=false
Type=Application
và đẩy nó vào /usr/local/share/applications/your-script.xml
hoặc ~/.local/share/your-script.xml
.
Cuối cùng chạy update-desktop-database
.
Vì bạn đang nhấp đúp vào tập lệnh, đây là công việc của trình quản lý tệp của bạn để xác nhận điều này. Đây không phải là công việc của kịch bản để xác nhận xem nó có nên chạy hay không. Mang điều này đến cùng cực. Bạn có thể tưởng tượng nó sẽ kỳ cục đến mức nào mỗi khi bạn gọi bất kỳ chương trình nào bạn phải xác nhận nó không?
Lần duy nhất khi một chương trình nên yêu cầu xác nhận là khi nó chuẩn bị làm điều gì đó có thể nguy hiểm và không thể đảo ngược. Ví dụ, ghi đè một tệp hoặc bỏ qua thùng rác. Và lưu ý rằng ngay cả những ví dụ này là về việc làm cho một chương trình làm một cái gì đó cụ thể. Họ không phải là về việc bắt đầu các chương trình như vậy. Nếu mục đích duy nhất của chương trình là làm điều nguy hiểm như vậy, thì nó cũng không nên yêu cầu xác nhận.
Thật vậy, Nautilus (trình quản lý tệp Gnome) theo mặc định sẽ yêu cầu bạn xác nhận nếu bạn muốn thực thi tập lệnh (hoặc chỉ mở nó trong trình soạn thảo văn bản).
Và tất nhiên, hành vi này có thể định cấu hình, cung cấp cho người dùng khả năng tắt nó (ghi chú nhập vào tệp văn bản thực thi ).
Vì vậy, đừng thêm hộp thoại xác nhận gây phiền nhiễu vào tập lệnh của bạn. Cấu hình trình quản lý tệp của bạn một cách chính xác. Và hãy để người dùng của bạn làm tương tự.
Bạn có thể sử dụng yad, giống như sự thoải mái trên steroid vì nó có cấu hình hơn nhiều. Bạn có thể cài đặt nó từ Trung tâm phần mềm trong Ubuntu. Ở dạng cơ bản nhất, bạn có thể gõ
yad --title=Question --image=dialog-question --text="Are you sure?"
Nếu OK được nhấn, chúng tôi sẽ nhận được mã trả về là 0, nếu nhấn Hủy, chúng tôi sẽ nhận được mã trả về là 1.
Sẽ tốt hơn nếu đặt hộp ở giữa và cũng điều chỉnh độ rộng của nó, sử dụng tab hàng đầu để định vị văn bản "Bạn có chắc không?" nhiều hơn ở bên phải và cũng có nó luôn luôn ở trên đầu. Đối với điều này, chúng ta cần:
yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200
Hầu hết các công tắc đều tự giải thích ngoại trừ "\ t" trước "Bạn có chắc không?" mà chỉ cần thêm một không gian tab trước khi in văn bản. Bây giờ chúng ta sẽ thấy điều này:
Hộp được đặt ở giữa, luôn ở trên đầu và trông đẹp hơn. Để đặt biến để kiểm tra nút nào được nhấn, hãy sử dụng:
yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result
Trong ví dụ này, chúng tôi đang sử dụng biến $ result sẽ được đặt thành 0 nếu nhấn OK hoặc 1 nếu Hủy được nhấn.
Để được giúp đỡ với yad bạn có thể sử dụng man yad
hoặc yad --help-all
nhưng tôi thấy các ví dụ thực tế dễ thích nghi hơn. Có một số ở đây . yad là cấu hình nhiều hơn và do đó có thể sử dụng nhiều hơn so với sự thoải mái theo ý kiến của tôi.
if zenity...
hoặczenity... || exit