ขอการยืนยันจากผู้ใช้ก่อนดำเนินการสคริปต์หรือไม่?


8

มีวิธีที่จะได้รับการยืนยันผู้ใช้ (เช่นคุณแน่ใจหรือไม่ / ใช่) กล่องโต้ตอบประเภทเมื่อฉันรันสคริปต์ (โดยดับเบิลคลิก)? ฉันไม่ได้หมายถึงเทอร์มินัล แต่มีกล่องยืนยันแบบกราฟิกบางอย่างเช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

(ฉันรู้ว่าภาพมาจาก windows ฉันไม่สามารถหา Linux ได้)

คำตอบ:


13

มีวิธีใช้อยู่ zenity

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

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถทดสอบออกจากสถานะของคำสั่งที่มีตัวแปรอะไรเช่นนี้$? คือ, คือยกเลิก โครงสร้างนี้จะทำงานได้ดีหากคุณต้องการทดสอบสถานะการออกของป๊อปอัปในภายหลังอาจเก็บได้ทันทีหลังจากที่ป๊อปอัปออกจากตัวแปร ตามที่กล่าวไว้ในความคิดเห็นโครงสร้างเช่นร้องยังจะทำงาน:if [ $? -eq 1 ];then exit 1 ; fi0OK1$?

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
Kevin

สามารถทำได้เช่นนั้น แต่ฉันชอบสไตล์ "ดั้งเดิม" มากขึ้น
Sergiy Kolodyazhnyy

2
ดูเหมือนว่าฉันค่อนข้างโง่ที่จะทดสอบสถานะการออกของโปรแกรมโดย ... ป้อนสถานะการออกของโปรแกรมไปยังโปรแกรมอื่น (หรือ shell builtin) จากนั้นทดสอบสถานะการออกของโปรแกรมนั้น
Kevin

มันค่อนข้างโง่ แต่มันกลายเป็นพลังแห่งนิสัย
Sergiy Kolodyazhnyy

6

คุณสามารถใช้xmessageในสคริปต์เอง ใส่อะไรแบบนี้หลังจาก "shebang":

xmessage "Are you sure?"

ข้อความนี้จะแสดงข้อความกราฟิกว่า "คุณแน่ใจหรือ ด้วยปุ่ม "ตกลง"

คุณสามารถกำหนดค่าxmessageให้มีมากกว่าหนึ่งปุ่มและเปลี่ยนสิ่งที่เขียนอยู่ในนั้น นอกจากนี้คุณยังสามารถกำหนดค่าการกระทำที่กระทำโดยแต่ละปุ่ม

ตัวอย่างเช่น,

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

ดูman xmessageตัวเลือกทั้งหมด (มีจำนวนมาก)


ขอบคุณ ... โซลูชันนี้ใช้งานได้ดี .. มันเป็นเพียงแค่ความยอดเยี่ยมที่แสดงบทสนทนาที่ดูดีกว่า .. ในแง่ของฟังก์ชั่นการทำงานทั้งสอง ...
mayank budhwani

5

แทนที่จะบอกวิธีทำฉันจะบอกคุณว่าคุณไม่ควรทำ

TL; DR - อย่าเปลี่ยนสคริปต์ของคุณ แทนที่จะกำหนดค่าตัวจัดการไฟล์หรือหาสาเหตุที่ทำให้ผู้ใช้ของคุณรันโดยไม่ตั้งใจ

แก้ไข:คุณดูเหมือนจะถือว่าสคริปต์ของคุณเป็นพิเศษอย่างใดราวกับว่าการตั้งค่าทั่วไปไม่ดีพอและสคริปต์ของคุณต้องการการยืนยันพิเศษจากผู้ใช้ คลิกสองครั้งที่มันเป็นการยืนยัน หากคุณพบว่าผู้ใช้ของคุณทำงานโดยไม่ได้ตั้งใจคุณต้องเข้าใจว่าทำไมพวกเขาถึงทำและแก้ปัญหาแทน ปัญหาที่แท้จริงของคุณไม่ใช่วิธีการยืนยัน แต่วิธีการป้องกันไม่ให้ผู้ใช้เรียกใช้โดยไม่ตั้งใจ

จากวิธีที่คุณเปิดเผยปัญหาของคุณดูเหมือนว่าคุณคาดว่าโปรแกรม (สคริปต์) ของคุณจะถูกเรียกใช้โดยนำทางไปยังที่ที่ไฟล์นั้นอยู่จากนั้นคลิกที่มันจากตัวจัดการไฟล์ คิดเกี่ยวกับโปรแกรมอื่น ๆ ทั้งหมดในระบบของคุณ คุณเริ่มเป็นแบบนั้นกี่คน? คุณนำทางไป/usr/local/binเมื่อเริ่ม Firefox หรือไม่ แน่นอนคุณทำไม่ได้ คุณคลิกที่มันจากเมนูแอปพลิเคชัน (gnome tweak เป็นสคริปต์ไพ ธ อนอาจเป็นตัวอย่างที่ดีกว่า)

หวังว่าคุณจะไม่พิจารณาคลิกที่มันจากเมนูแอปพลิเคชันที่เกิดอุบัติเหตุ ดังนั้นปัญหาของคุณจึงกลายเป็นวิธีทำให้สคริปต์ของคุณปรากฏที่นั่นแทนที่จะใช้ตัวจัดการไฟล์ เมื่อต้องการทำสิ่งนี้คุณทำสิ่งต่อไปนี้:

  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 - แท็บพฤติกรรม

ดังนั้นอย่าเพิ่มกรอบข้อความยืนยันที่น่ารำคาญในสคริปต์ของคุณ กำหนดค่าตัวจัดการไฟล์ของคุณอย่างถูกต้อง และให้ผู้ใช้ของคุณทำเช่นเดียวกัน


1
นี่ไม่ใช่วิธีการแก้ปัญหาเนื่องจากไม่สามารถแบ่งปันกับผู้อื่นได้ง่ายและปลอดภัย
Ismael Miguel

ขอบคุณ ... ฉันรู้วิธีที่จะทำ .. แต่นี่เป็นการเพิ่มการยืนยันให้กับทุกคน ... ฉันต้องการสคริปต์ที่เฉพาะเจาะจง ...
mayank budhwani

@ IsmaelMiguel แต่นั่นคือจุดรวมของคำตอบ ไม่ควรแบ่งปัน การกระทำของโปรแกรมและพฤติกรรม / ประสบการณ์ของระบบมีสองสิ่งที่แตกต่างกัน คุณไม่ควรรวมสองอย่างนี้เข้าด้วยกัน
carandraug

@IsmaelMiguel คำตอบนี้ชี้ให้เห็นถึงรูปแบบการต่อต้านของสิ่งที่ผู้ใช้ต้องการทำ ไม่ให้ปลาแก่ผู้ถามเพราะเขาแพ้
Braiam

@mayankbudhwani คุณยังคงแก้ปัญหาที่ไม่ถูกต้องอยู่ ทำไมสคริปต์พิเศษนั้นถึงพิเศษ? หากผู้ใช้ของคุณคลิกโดยบังเอิญนั่นเป็นปัญหาอื่น ฉันได้แก้ไขคำตอบด้วยวิธีการอื่น
carandraug

2

คุณสามารถใช้ yad ซึ่งเป็นเหมือน zenity บนเตียรอยด์เนื่องจากมันสามารถกำหนดค่าได้มากขึ้น คุณสามารถติดตั้งได้จาก Software Center ใน 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 หากกดตกลงหรือ 1 หากกดยกเลิก

สำหรับความช่วยเหลือกับ yad คุณสามารถใช้man yadหรือyad --help-allแต่ฉันพบว่าตัวอย่างที่ใช้งานได้จริงนั้นง่ายต่อการปรับตัว มีบางคนที่นี่ yad มีการกำหนดค่าได้มากกว่าและใช้งานได้ดีกว่าความเป็นส่วนตัวในความคิดของฉัน


ในกรณีที่ช่วยใครก็ตามที่ฉันโพสต์การใช้ yad หนึ่งครั้ง คุณสามารถดูได้ที่นี่: askubuntu.com/questions/488350/…
Scooby-2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.