คำตอบ:
มีวิธีใช้อยู่ 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
ในสคริปต์เอง ใส่อะไรแบบนี้หลังจาก "shebang":
xmessage "Are you sure?"
ข้อความนี้จะแสดงข้อความกราฟิกว่า "คุณแน่ใจหรือ ด้วยปุ่ม "ตกลง"
คุณสามารถกำหนดค่าxmessage
ให้มีมากกว่าหนึ่งปุ่มและเปลี่ยนสิ่งที่เขียนอยู่ในนั้น นอกจากนี้คุณยังสามารถกำหนดค่าการกระทำที่กระทำโดยแต่ละปุ่ม
ตัวอย่างเช่น,
xmessage -buttons ok:0,cancel:1 "Are you sure?"
ดูman xmessage
ตัวเลือกทั้งหมด (มีจำนวนมาก)
แทนที่จะบอกวิธีทำฉันจะบอกคุณว่าคุณไม่ควรทำ
TL; DR - อย่าเปลี่ยนสคริปต์ของคุณ แทนที่จะกำหนดค่าตัวจัดการไฟล์หรือหาสาเหตุที่ทำให้ผู้ใช้ของคุณรันโดยไม่ตั้งใจ
แก้ไข:คุณดูเหมือนจะถือว่าสคริปต์ของคุณเป็นพิเศษอย่างใดราวกับว่าการตั้งค่าทั่วไปไม่ดีพอและสคริปต์ของคุณต้องการการยืนยันพิเศษจากผู้ใช้ คลิกสองครั้งที่มันเป็นการยืนยัน หากคุณพบว่าผู้ใช้ของคุณทำงานโดยไม่ได้ตั้งใจคุณต้องเข้าใจว่าทำไมพวกเขาถึงทำและแก้ปัญหาแทน ปัญหาที่แท้จริงของคุณไม่ใช่วิธีการยืนยัน แต่วิธีการป้องกันไม่ให้ผู้ใช้เรียกใช้โดยไม่ตั้งใจ
จากวิธีที่คุณเปิดเผยปัญหาของคุณดูเหมือนว่าคุณคาดว่าโปรแกรม (สคริปต์) ของคุณจะถูกเรียกใช้โดยนำทางไปยังที่ที่ไฟล์นั้นอยู่จากนั้นคลิกที่มันจากตัวจัดการไฟล์ คิดเกี่ยวกับโปรแกรมอื่น ๆ ทั้งหมดในระบบของคุณ คุณเริ่มเป็นแบบนั้นกี่คน? คุณนำทางไป/usr/local/bin
เมื่อเริ่ม Firefox หรือไม่ แน่นอนคุณทำไม่ได้ คุณคลิกที่มันจากเมนูแอปพลิเคชัน (gnome tweak เป็นสคริปต์ไพ ธ อนอาจเป็นตัวอย่างที่ดีกว่า)
หวังว่าคุณจะไม่พิจารณาคลิกที่มันจากเมนูแอปพลิเคชันที่เกิดอุบัติเหตุ ดังนั้นปัญหาของคุณจึงกลายเป็นวิธีทำให้สคริปต์ของคุณปรากฏที่นั่นแทนที่จะใช้ตัวจัดการไฟล์ เมื่อต้องการทำสิ่งนี้คุณทำสิ่งต่อไปนี้:
วางสคริปต์ของคุณให้ห่างจากไฟล์อื่น ๆ ที่ผู้ใช้สามารถคลิกได้โดยไม่ตั้งใจ (สถานที่ทั่วไป/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 บนเตียรอยด์เนื่องจากมันสามารถกำหนดค่าได้มากขึ้น คุณสามารถติดตั้งได้จาก Software Center ใน 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 หากกดตกลงหรือ 1 หากกดยกเลิก
สำหรับความช่วยเหลือกับ yad คุณสามารถใช้man yad
หรือyad --help-all
แต่ฉันพบว่าตัวอย่างที่ใช้งานได้จริงนั้นง่ายต่อการปรับตัว มีบางคนที่นี่ yad มีการกำหนดค่าได้มากกว่าและใช้งานได้ดีกว่าความเป็นส่วนตัวในความคิดของฉัน
if zenity...
หรือzenity... || exit