Yêu cầu xác nhận người dùng trước khi thực hiện một kịch bản?


8

Có cách nào để nhận hộp thoại loại Xác nhận người dùng (Giống như bạn chắc chắn - Có / Không) khi tôi thực thi tập lệnh (bằng cách nhấp đúp) không? Tôi không có ý trong Terminal, nhưng một hộp xác nhận đồ họa, đại loại như thế này: nhập mô tả hình ảnh ở đây

(Tôi biết hình ảnh là từ các cửa sổ, tôi không thể tìm thấy Linux)

Câu trả lời:


13

Có một cách sử dụng zenity

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

nhập mô tả hình ảnh ở đây

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. 0OK, 1là 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:/"

2
Bạn không cần dấu ngoặc vuông. Chỉ cần làm if zenity...hoặczenity... || exit
Kevin

Có thể được thực hiện theo cách đó, nhưng tôi thích phong cách "truyền thống" hơn
Sergiy Kolodyazhnyy

2
Tôi chỉ có vẻ khá ngớ ngẩn khi kiểm tra trạng thái thoát của chương trình bằng cách ... đưa trạng thái thoát của nó sang chương trình khác (hoặc shell dựng) và sau đó kiểm tra trạng thái thoát của chương trình đó.
Kevin

Nó hơi ngớ ngẩn, nhưng nó đã trở thành một thói quen
Sergiy Kolodyazhnyy

6

Bạn có thể sử dụng xmessagetrong 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 xmessagecho tất cả các tùy chọn (có rất nhiều trong số họ).


Cảm ơn ... Giải pháp này cũng hoạt động tốt .. Chỉ là màn zenity một hộp thoại tìm kiếm tốt hơn .. Về mặt chức năng, cả hai công việc ...
Mayank budhwani

5

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ó 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/binkhi 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:

  1. đặ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)

  2. 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.xmlhoặc ~/.local/share/your-script.xml.

  3. 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).

Hộp thoại xác nhận Nautilus

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 ).

Menu tùy chọn Nautilus - tab hành vi

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ự.


1
Đây thực sự không phải là một giải pháp, vì điều này không thể chia sẻ dễ dàng và an toàn với người khác.
Ismael Miguel

Cảm ơn ... Tôi biết làm thế nào để làm điều đó .. Nhưng điều này thêm một xác nhận cho tất cả các scip ... Tôi muốn nó cho một kịch bản cụ thể ...
mayank budhwani

@IsmaelMiguel nhưng đó là toàn bộ câu trả lời. Nó không nên được chia sẻ. Có hai điều khác nhau, hành động của chương trình và hành vi / trải nghiệm hệ thống. Bạn không nên hợp nhất hai.
carandraug

@IsmaelMiguel câu trả lời này chỉ ra mô hình chống lại những gì người dùng muốn làm. Nó không đưa cá cho người hỏi vì anh ta bị dị ứng.
Braiam

@mayankbudhwani bạn vẫn đang giải quyết vấn đề sai. Tại sao kịch bản đặc biệt đó là đặc biệt? Nếu người dùng của bạn nhấp vào nó một cách tình cờ, đó là một vấn đề khác. Tôi đã chỉnh sửa câu trả lời với một cách tiếp cận khác.
carandraug

2

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?"

và bạn sẽ thấy điều này: ảnh chụp màn hình 1

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:nhập mô tả hình ảnh ở đâ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 yadhoặc yad --help-allnhư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.


Trong trường hợp nó giúp bất cứ ai tôi đã đăng việc sử dụng yad một lần trước đây. Bạn có thể thấy nó ở đây: askubfox.com/questions/488350/ từ
Scooby-2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.