วิธีเพิ่ม GUI ให้กับ Linux Shell Scripts
เผยแพร่แล้ว: 2022-01-29 คุณสามารถใช้หน้าต่าง GUI, ตัวเลื่อน, ปุ่มตัวเลือก, แถบความคืบหน้า และอื่นๆ ในสคริปต์ทุบตีของคุณ เรียนรู้วิธีใช้ชุดเครื่องมือ zenity
และปรับโฉมสคริปต์ Bash ของคุณ เราจะแสดงให้คุณเห็นว่า
การเขียนสคริปต์ Bash เป็นภาษาการเขียนโปรแกรมที่ทรงพลัง และเนื่องจากมันสร้างไว้ในเปลือก Bash จึงพร้อมให้ทุกคนใช้งานได้ เป็นภาษาที่ง่ายต่อการเริ่มเขียนโปรแกรม เนื่องจากจะมีการแปลความหมาย คุณไม่จำเป็นต้องคอมไพล์สคริปต์ ทันทีที่คุณแก้ไขไฟล์สคริปต์และทำให้สามารถเรียกใช้งานได้ คุณจะสามารถเรียกใช้ได้ สิ่งนี้ทำให้รอบการเข้ารหัส รัน และดีบักค่อนข้างมีประสิทธิภาพ
มีข้อร้องเรียนหลักสองประการที่ผู้คนมีกับสคริปต์ Bash และประการแรกคือความเร็ว เนื่องจากเปลือก Bash ตีความคำสั่งในสคริปต์ คำสั่งจึงไม่ดำเนินการเร็วเท่ากับโค้ดที่คอมไพล์ อย่างไรก็ตาม มันก็เหมือนกับการบ่นว่ารถแทรกเตอร์ไม่เร็วเท่ารถ พวกมันมีไว้สำหรับสิ่งต่าง ๆ
มีความเร็วสองประเภทแม้ว่า คุณมักจะใช้สคริปต์ด่วนเพื่อทำงานให้เสร็จได้เร็วกว่าการพัฒนาโซลูชันในภาษาที่คอมไพล์ เช่น C
ข้อร้องเรียนที่สองที่ผู้คนมีกับสคริปต์ Bash คืออินเทอร์เฟซผู้ใช้ ซึ่งเป็นหน้าต่างเทอร์มินัล แน่นอน บางครั้งอินเทอร์เฟซก็ไม่สำคัญ หากบุคคลเดียวที่เคยใช้สคริปต์คือผู้เขียน อินเทอร์เฟซอาจไม่สำคัญขนาดนั้น และไม่สำคัญสำหรับสคริปต์ที่ทำการประมวลผลพื้นหลังและประเภทแบทช์ โดยปกติ สคริปต์ดังกล่าวไม่ต้องการการโต้ตอบกับผู้ใช้มากนัก (ถ้ามี)
มีบางครั้งที่คุณต้องการบางสิ่งที่ใช้งานง่ายและทันสมัยกว่าหน้าต่างเทอร์มินัล คนส่วนใหญ่คุ้นเคยกับอินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) เพื่อให้ผู้คนได้รับประสบการณ์ที่ราบรื่นที่สุด คุณต้องสร้างและใช้องค์ประกอบ GUI จากสคริปต์ของคุณ
แอปพลิเคชั่น zenity
zenity
ช่วยให้คุณสามารถรวมองค์ประกอบส่วนต่อประสานกราฟิกที่หลากหลายในสคริปต์ทุบตีของคุณ เป็นชุดเครื่องมืออันทรงพลังที่ช่วยให้สคริปต์ของคุณมีความรู้สึกสมัยใหม่และรูปลักษณ์ร่วมสมัยที่คุ้นเคย
zenity
ได้รับการติดตั้งไว้ล่วงหน้าบน Ubuntu, Fedora และ Manjaro distributions เป็นส่วนหนึ่งของ GNOME หากคุณใช้ KDE คุณอาจต้องการลองใช้ kdialog
แทน แม้ว่า zenity
จะทำงานบนสภาพแวดล้อมเดสก์ท็อปก็ตาม
ตัวอย่างในบทความนี้แสดงวิธีสร้างหน้าต่างโต้ตอบต่างๆ จากบรรทัดคำสั่ง วิธีบันทึกค่าที่ส่งกลับและการเลือกของผู้ใช้ในตัวแปร และวิธีใช้หน้าต่างโต้ตอบในสคริปต์
ปิดท้ายด้วยแอปพลิเคชั่นขนาดเล็กที่ใช้หน้าต่างโต้ตอบทั้งสามประเภท
หน้าต่างโต้ตอบปฏิทิน
หน้าต่างโต้ตอบปฏิทินช่วยให้ผู้อื่นเลือกวันที่ได้ ในการสร้างด้วย zenity
ต้องใช้คำสั่งเดียวสองคำ:
zenity -- ปฏิทิน
หน้าต่างโต้ตอบปฏิทินจะปรากฏขึ้น มีฟังก์ชันทั้งหมดที่คุณคาดหวังจากตัวเลือกวันที่มาตรฐาน คุณสามารถเปลี่ยนเดือนและปี และคลิกที่วันเพื่อเลือกวันที่นั้น ตามค่าเริ่มต้น วันที่ของวันนี้จะถูกเน้นเมื่อหน้าต่างปรากฏขึ้น
คลิก "ตกลง" เพื่อปิดหน้าต่างโต้ตอบและเลือกวันที่ที่ไฮไลต์ การดับเบิลคลิกที่วันที่จะทำสิ่งเดียวกัน
หากคุณไม่ต้องการเลือกวันที่ ให้คลิก "ยกเลิก" กดปุ่ม "Esc" บนแป้นพิมพ์ของคุณ หรือปิดหน้าต่างโต้ตอบ
ในตัวอย่างด้านบน 19 สิงหาคม 2019 ถูกเลือก หากผู้ใช้คลิก "ตกลง" ปฏิทินจะปิดลง และวันที่ที่เลือกจะพิมพ์ออกมาในหน้าต่างเทอร์มินัล
คุณสามารถละเว้นบรรทัด “GTKDialog ที่แมปโดยไม่มีพาเรนต์ชั่วคราว นี่ท้อแท้”
GTK ย่อมาจาก GIMP Tool Kit ซึ่งเป็นชุดเครื่องมือที่ใช้ในการพัฒนาอินเทอร์เฟซ GNOME เดิมทีมันถูกคิดค้นโดยผู้เขียน GNU Image Manipulation Program (GIMP) GNU ย่อมาจาก Not Unix ของ GNU
เครื่องยนต์ GTK กำลังเตือนผู้เขียนถึงความ zenity
ว่าพวกเขาได้ใช้ส่วนประกอบ GTK ในลักษณะที่ไม่เป็นไปตามมาตรฐาน
จับค่าวันที่
การพิมพ์วันที่ไปยังเครื่องอ่านบัตรไม่ได้ช่วยอะไรเรามากนัก หากเราจะเรียกปฏิทินนี้จากสคริปต์ของเรา เราจำเป็นต้องบันทึกค่าวันที่ที่เลือกไว้ เพื่อที่เราจะสามารถทำสิ่งที่มีประโยชน์ในสคริปต์ของเราได้ เราจะปรับแต่งปฏิทินเล็กน้อยด้วย
เราจะใช้ตัวเลือกต่อไปนี้กับปฏิทิน ต้องใช้ร่วมกับแฟล็ก “–” แบบดับเบิ้ลแดช:
- –text : ระบุสตริงข้อความที่จะแสดงในปฏิทิน แทนที่ค่าเริ่มต้น "เลือกวันที่จากด้านล่าง"
- –title : ตั้งชื่อของหน้าต่างโต้ตอบปฏิทิน
- –day : ตั้งค่าวันที่เลือกเมื่อเปิดปฏิทิน
- – เดือน : ตั้งค่าเดือนที่เลือกเมื่อเปิดปฏิทิน
- –year : ตั้งค่าปีที่เลือกเมื่อเปิดปฏิทิน
เรากำลังใช้ตัวแปรที่เรียกว่า ChosenDate
เพื่อบันทึกวันที่ที่ส่งคืนจากปฏิทิน และเรากำลังใช้ echo $ChosenDate
เพื่อพิมพ์วันที่นั้นไปที่หน้าต่างเทอร์มินัล
ใช่ เราได้ผลลัพธ์แบบเดียวกันในตัวอย่างก่อนหน้านี้ แต่ที่นี่ เราได้เก็บวันที่ที่เลือกไว้ในตัวแปร ในตัวอย่างก่อนหน้านี้ มันถูกพิมพ์และลืมไป
ChosenDate=$(zenity -- ปฏิทิน -- ข้อความ "เลือกวันที่" -- หัวข้อ "How-To Geek Rota" -- วันที่ 1 -- เดือน 9 -- ปี 2019); echo $ChosenDate
ตอนนี้ ปฏิทินจะแสดงข้อความแจ้งและชื่อหน้าต่างของเรา วันที่ถูกกำหนดเป็นวันที่เริ่มต้นที่เราเลือกแทนที่จะเป็นวันที่ของวันนี้
เรายังปรับแต่งรูปแบบของสตริงวันที่ที่ส่งคืนเมื่อมีการเลือกได้อีกด้วย ตัวเลือก --date-format
ต้องตามด้วยตัวระบุรูปแบบ นี่คือสตริงของโทเค็นที่กำหนดข้อมูลและรูปแบบที่จะรวมอยู่ในเอาต์พุต โทเค็นจะเหมือนกับที่ใช้กับฟังก์ชันภาษาซี strftime()
และมีให้เลือกมากมาย
โทเค็นที่เราใช้คือ:
- %A : ชื่อเต็มของวันในสัปดาห์
- %d : วันของเดือนเป็นตัวเลข
- %m : เดือนเป็นตัวเลข
- %y : ปีเป็นตัวเลขสองหลัก (ไม่มีศตวรรษ)
ChosenDate=$(zenity -- ปฏิทิน --text "เลือกวันที่" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 -- เดือนที่ 9 --ปี 2019); echo $ChosenDate
มีคนเลือกวันที่:
และวันที่จะถูกส่งกลับโดยใช้รูปแบบของเรา แสดงชื่อวันในสัปดาห์ ตามด้วยวันที่ในลำดับยุโรป ได้แก่ วัน เดือน ปี
หน้าต่างไดอะล็อกการเลือกไฟล์: การเลือกไฟล์
หน้าต่างโต้ตอบการเลือกไฟล์ค่อนข้างซับซ้อน ผู้ใช้สามารถเรียกดูผ่านระบบไฟล์ ไฮไลต์ไฟล์หรือไฟล์ จากนั้นคลิก "ตกลง" เพื่อเลือกไฟล์เหล่านั้นหรือยกเลิกการเลือกทั้งหมด
zenity
มีฟังก์ชันทั้งหมดนี้และอีกมากมาย และใช้งานง่ายพอๆ กับหน้าต่างโต้ตอบของปฏิทิน
ตัวเลือกใหม่ที่เราจะใช้คือ:
- –file-selection : บอก
zenity
ว่าเราต้องการใช้หน้าต่างโต้ตอบการเลือกไฟล์ - –multiple : อนุญาตให้บางคนเลือกไฟล์มากกว่าหนึ่งไฟล์
- –file-filter : บอกหน้าต่างโต้ตอบไฟล์ว่าจะแสดงประเภทไฟล์ใด
zenity --file-selection --tile "How-To Geek" --multiple --file-filter='*.mm *.png *.page *.sh *.txt'
หน้าต่างโต้ตอบการเลือกไฟล์ทำงานเหมือนกับหน้าต่างการเลือกไฟล์อื่นๆ
ผู้ใช้สามารถเรียกดูระบบไฟล์และเลือกไฟล์ที่ต้องการได้
เราได้เรียกดูไดเรกทอรีใหม่และเลือกไฟล์ชื่อ “button_hybrid.png”
เมื่อคุณคลิก "ตกลง" หน้าต่างโต้ตอบการเลือกไฟล์จะปิดลง และชื่อไฟล์และเส้นทางจะพิมพ์ในหน้าต่างเทอร์มินัล
หากคุณต้องการใช้ชื่อไฟล์ในการประมวลผลใดๆ เพิ่มเติม คุณสามารถบันทึกชื่อไฟล์นั้นในตัวแปรได้ เช่นเดียวกับที่คุณทำกับวันที่ในปฏิทิน
หน้าต่างไดอะล็อกการเลือกไฟล์: การบันทึกไฟล์
ถ้าเราเพิ่มหนึ่งตัวเลือก เราสามารถเปลี่ยนหน้าต่างโต้ตอบการเลือกไฟล์เป็นหน้าต่างโต้ตอบบันทึกไฟล์ได้ ตัวเลือกคือ --save
เราจะใช้ตัวเลือก --confirm-overwrite
ซึ่งจะแจ้งให้บุคคลนั้นยืนยันว่าต้องการเขียนทับไฟล์ที่มีอยู่
ตอบกลับ=$(zenity --file-selection --save --confirm-overwrite); echo $Response
หน้าต่างโต้ตอบการบันทึกไฟล์จะปรากฏขึ้น โปรดทราบว่ามีฟิลด์ข้อความที่ผู้อื่นสามารถพิมพ์ชื่อไฟล์ได้
ผู้ใช้สามารถเรียกดูตำแหน่งที่ต้องการได้ภายในระบบไฟล์ ระบุชื่อไฟล์ หรือคลิกไฟล์ที่มีอยู่เพื่อเขียนทับ
ในตัวอย่างข้างต้น ผู้ใช้ไฮไลต์ไฟล์ที่มีอยู่
เมื่อเขาคลิก "ตกลง" หน้าต่างโต้ตอบการยืนยันจะปรากฏขึ้นเพื่อขอให้เขายืนยันว่าต้องการแทนที่ไฟล์ที่มีอยู่ สังเกตว่าชื่อไฟล์ปรากฏในไดอะล็อกคำเตือน นั่นคือความใส่ใจในรายละเอียดที่ทำให้ zenity
เป็นมืออาชีพ
ถ้าเราไม่ได้ใช้ --confirm-overwrite
ตัวเลือก ไฟล์จะถูกเขียนทับโดยไม่โต้ตอบ
ชื่อของไฟล์ถูกเก็บไว้ในตัวแปร Response
ซึ่งพิมพ์ไปที่หน้าต่างเทอร์มินัล
หน้าต่างโต้ตอบการแจ้งเตือน
ด้วย zenity
รวมถึงหน้าต่างโต้ตอบการแจ้งเตือนที่ลื่นไหลในสคริปต์ของคุณนั้นทำได้อย่างง่ายดาย มีหน้าต่างโต้ตอบหุ้นที่คุณสามารถเรียกใช้เพื่อให้ข้อมูล คำเตือน ข้อความแสดงข้อผิดพลาด และคำถามสำหรับผู้ใช้
ในการสร้างหน้าต่างข้อความแสดงข้อผิดพลาด ให้ใช้คำสั่งต่อไปนี้:
zenity --error --width 300 --text "การอนุญาตถูกปฏิเสธ ไม่สามารถเขียนไปยังไฟล์ได้"
ตัวเลือกใหม่ที่เราใช้คือ:
- –error : บอก
zenity
ว่าเราต้องการใช้หน้าต่างโต้ตอบข้อผิดพลาด - –width : ตั้งค่าความกว้างเริ่มต้นของหน้าต่าง
หน้าต่างข้อความแสดงข้อผิดพลาดปรากฏขึ้นที่ความกว้างที่ระบุ ใช้ไอคอนข้อผิดพลาด GTK มาตรฐาน
ในการสร้างหน้าต่างโต้ตอบข้อมูล ให้ใช้คำสั่งต่อไปนี้:
zenity --info --width 300 --text "อัปเดตเสร็จสมบูรณ์ คลิกตกลงเพื่อดำเนินการต่อ"
ตัวเลือกใหม่ที่เราใช้คือ --info
ซึ่งบอกให้ zenity
สร้างหน้าต่างโต้ตอบข้อมูล
ในการสร้างหน้าต่างโต้ตอบคำถาม ให้ใช้คำสั่งต่อไปนี้:
zenity --question --width 300 --text "คุณยินดีที่จะดำเนินการต่อหรือไม่"; เสียงสะท้อน $?
ตัวเลือกใหม่ที่เราใช้คือ --question
ซึ่งบอกให้ zenity
สร้างหน้าต่างโต้ตอบคำถาม
$?
เป็นพารามิเตอร์พิเศษ เก็บค่าส่งคืนจากไปป์ไลน์ที่เรียกใช้งานล่าสุด โดยทั่วไป นี่คือค่าจากกระบวนการที่ปิดล่าสุด ค่าศูนย์หมายถึง "ตกลง" และค่าอย่างน้อยหนึ่งค่าหมายถึง "ยกเลิก"
นี่เป็นเทคนิคทั่วไปที่คุณสามารถนำไปใช้กับหน้าต่างไดอะล็อก zenity
ใดก็ได้ โดยการตรวจสอบค่านี้ในสคริปต์ของคุณ คุณสามารถกำหนดได้ว่าข้อมูลที่ส่งคืนจากหน้าต่างโต้ตอบควรได้รับการประมวลผลหรือละเว้น
เราคลิก "ใช่" ดังนั้นรหัสส่งคืนจึงเป็นศูนย์ที่ระบุว่า "ตกลง"
ในการสร้างหน้าต่างโต้ตอบคำเตือน ให้ใช้คำสั่งต่อไปนี้:
zenity --warning --title "Low Hard Drive Space" --width 300 --text "อาจมีเนื้อที่ฮาร์ดไดรฟ์ไม่เพียงพอที่จะบันทึกข้อมูลสำรอง"
ตัวเลือกใหม่ที่เราใช้คือ --warning
ซึ่งบอกให้ zenity
สร้างหน้าต่างโต้ตอบคำเตือน
หน้าต่างโต้ตอบคำเตือนจะปรากฏขึ้น ไม่ใช่คำถาม จึงมีปุ่มเดียวเท่านั้น
หน้าต่างโต้ตอบความคืบหน้า
คุณสามารถใช้หน้าต่างโต้ตอบความคืบหน้าของ zenity
เพื่อแสดงแถบความคืบหน้าที่ระบุว่าสคริปต์ของคุณใกล้จะเสร็จสมบูรณ์เพียงใด
แถบความคืบหน้าเป็นขั้นสูงตามค่าที่ได้รับจากสคริปต์ของคุณ เพื่อแสดงหลักการให้ใช้คำสั่งต่อไปนี้:
(สำหรับ i ใน $(seq 0 10 100); do echo $i; sleep 1; done)
คำสั่งแบ่งดังนี้:
- คำสั่ง
seq
ดำเนินการตามลำดับตั้งแต่ 0 ถึง 100 ในขั้นตอนที่ 10 - ในแต่ละขั้นตอน ค่าจะถูกเก็บไว้ในตัวแปร
i
สิ่งนี้จะพิมพ์ไปที่หน้าต่างเทอร์มินัล - คำสั่งหยุดเป็นเวลาหนึ่งวินาที เนื่องจากคำสั่ง
sleep 1
เราสามารถใช้สิ่งนี้กับหน้าต่างโต้ตอบความคืบหน้าของ zenity
เพื่อแสดงแถบความคืบหน้า โปรดทราบว่าเรากำลังส่งผลลัพธ์ของคำสั่งก่อนหน้าเป็น zenity:
(สำหรับฉันใน $(seq 0 10 100); do echo $i; sleep 1; done) | zenity -- ความคืบหน้า -- หัวข้อ "How-To Geek" -- ปิดอัตโนมัติ
ตัวเลือกใหม่ที่เราใช้คือ:
- –progress : บอก
zenity
ว่าเราต้องการใช้หน้าต่างโต้ตอบความคืบหน้า - –auto-close : ปิดกล่องโต้ตอบเมื่อแถบความคืบหน้าถึง 100 เปอร์เซ็นต์
หน้าต่างข้อความแสดงความคืบหน้าจะปรากฏขึ้น และแถบเลื่อนไปข้างหน้าถึง 100 เปอร์เซ็นต์ โดยจะหยุดระหว่างแต่ละขั้นตอนเป็นเวลาหนึ่งวินาที
เราสามารถใช้แนวคิดของการไพพ์ค่าลงใน zenity
เพื่อรวมหน้าต่างโต้ตอบความคืบหน้าในสคริปต์
ป้อนข้อความนี้ในตัวแก้ไขและบันทึกเป็น “progress.sh”
!/bin/bash ฟังก์ชั่นรายการงาน () { echo "# ผลงานชิ้นแรก" เสียงสะท้อน "25" นอน 1 echo "# ไอเท็มงานที่สอง" เสียงสะท้อน "50" นอน 1 echo "# รายการงานที่สาม" เสียงสะท้อน "75" นอน 1 echo "# รายการงานสุดท้าย" เสียงสะท้อน "100" นอน 1 } รายการงาน | zenity --progress --title "How-To Geek" --auto-close ทางออก 0
นี่คือรายละเอียดของสคริปต์:
- สคริปต์กำหนดฟังก์ชันที่เรียกว่า
work-list
งาน นี่คือที่ที่คุณใส่คำสั่งและคำแนะนำในการทำงานจริง แทนที่คำสั่งsleep 1
แต่ละคำสั่งด้วยคำสั่งจริงของคุณ -
zenity
ยอมรับบรรทัดecho "# ..."
และแสดงในหน้าต่างโต้ตอบความคืบหน้า เปลี่ยนข้อความของบรรทัดเหล่านี้ เพื่อส่งข้อความข้อมูลไปยังผู้ใช้ - เส้น
echo
ที่มีตัวเลข เช่นecho "25"
ได้รับการยอมรับจากzenity
และตั้งค่าแถบความคืบหน้าด้วย - ฟังก์ชันรายการงานถูกเรียกและวางลงใน
zenity
ใช้คำสั่งนี้เพื่อทำให้สคริปต์ทำงานได้:
chmod +x ความคืบหน้า.sh
ใช้คำสั่งนี้เพื่อเรียกใช้สคริปต์:
./progress.sh
สคริปต์ทำงาน และข้อความจะเปลี่ยนไปตามแต่ละเฟสของสคริปต์ดำเนินการ แถบความคืบหน้าจะเคลื่อนที่เป็นขั้นๆ ไปที่ 100 เปอร์เซ็นต์
หน้าต่างโต้ตอบมาตราส่วน
หน้าต่างโต้ตอบมาตราส่วนช่วยให้ผู้อื่นเลื่อนแถบเลื่อนเพื่อเลือกค่าตัวเลขได้ ซึ่งหมายความว่าเธอไม่สามารถป้อนค่าที่สูงหรือต่ำเกินไป
ตัวเลือกใหม่ที่เราใช้คือ:
- –scale : บอก
zenity
ว่าเราต้องการใช้หน้าต่างโต้ตอบมาตราส่วน - –min-value : ตั้งค่าต่ำสุดสำหรับมาตราส่วน
- –max-value : ตั้งค่าสูงสุดสำหรับมาตราส่วน
- – ขั้นตอน : ตั้งค่าจำนวนที่ตัวเลื่อนจะเคลื่อนเข้ามาเมื่อใช้ปุ่มลูกศร การดำเนินการนี้จะไม่ส่งผลต่อการเคลื่อนไหวของตัวเลื่อนหากมีคนใช้เมาส์
- –value : ตั้งค่าเริ่มต้นและตำแหน่งของตัวเลื่อน
นี่คือคำสั่งที่เราใช้:
Response=$(zenity --scale --title "How-To Geek" --text "Selectการขยาย" --min-value=0 --max-value=30 --step=3 --value15); echo $Response
หน้าต่างโต้ตอบของตัวเลื่อนจะปรากฏขึ้นโดยตั้งค่าตัวเลื่อนเป็น 15
ผู้ใช้สามารถเลื่อนแถบเลื่อนเพื่อเลือกค่าใหม่
เมื่อเธอคลิก "ตกลง" ค่าจะถูกโอนไปยังตัวแปร Response
และพิมพ์ไปยังหน้าต่างเทอร์มินัล
หน้าต่างโต้ตอบรายการ
หน้าต่างโต้ตอบรายการช่วยให้ผู้อื่นป้อนข้อความได้
ตัวเลือกใหม่ที่เราใช้คือ:
- –entry : บอก
zenity
ว่าเราต้องการใช้หน้าต่างโต้ตอบรายการ - –entry-text : คุณสามารถใช้ได้หากต้องการพิมพ์ค่าที่แนะนำในช่องป้อนข้อความ เรากำลังใช้ “” เพื่อบังคับให้มีช่องว่าง ไม่จำเป็นอย่างยิ่ง แต่เราต้องการบันทึกตัวเลือกนี้
คำสั่งแบบเต็มมีลักษณะดังนี้:
Response=$(zenity --entry --text "ป้อนคำค้นหาของคุณ" --title "Howe-To Geek" --entry-text=""); echo $Response
หน้าต่างโต้ตอบแบบง่ายจะปรากฏขึ้น โดยมีฟิลด์ป้อนข้อความ
บุคคลอื่นสามารถพิมพ์และแก้ไขข้อความได้
เมื่อเขาคลิก "ตกลง" ค่าที่เขาพิมพ์จะถูกกำหนดให้กับตัวแปร Response เราใช้ echo เพื่อพิมพ์ค่าของตัวแปรในหน้าต่างเทอร์มินัล
วางมันทั้งหมดเข้าด้วยกัน
มารวมเทคนิคเหล่านี้เข้าด้วยกันและสร้างสคริปต์การทำงานกัน สคริปต์จะทำการสแกนข้อมูลฮาร์ดแวร์และนำเสนอผลลัพธ์แก่ผู้ใช้ในหน้าต่างข้อความแบบเลื่อน เธอสามารถเลือกประเภทการสแกนแบบยาวหรือแบบสั้นได้
สำหรับสคริปต์นี้ เราจะใช้หน้าต่างโต้ตอบสามประเภท ซึ่งสองประเภทเป็นหน้าต่างใหม่สำหรับเรา:
- อย่างแรกคือหน้าต่างโต้ตอบรายการ จะช่วยให้ใครสักคนเลือกได้
- อย่างที่สองคือหน้าต่างโต้ตอบความคืบหน้าที่แจ้งให้ผู้ใช้ทราบว่ามีบางอย่างกำลังเกิดขึ้น และเธอควรรอ
- ที่สามคือหน้าต่างข้อมูลข้อความซึ่งแสดงผลให้กับผู้ใช้
ป้อนข้อความนี้ในตัวแก้ไขและบันทึกเป็น “hardware-info.sh”
#!/bin/bash # แสดงรายการฮาร์ดแวร์สำหรับคอมพิวเตอร์เครื่องนี้ TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'การสแกนฮาร์ดแวร์' \ --text 'เลือกประเภทการสแกน:' \ --column 'เลือก' \ --column 'ประเภทการสแกน' TRUE "Short" FALSE "Long"` ถ้า [[ $? -eq 1 ]]; แล้ว # พวกเขากดยกเลิกหรือปิดหน้าต่างโต้ตอบ zenity --error --title="สแกนถูกปฏิเสธ" --width=200 \ --text="ข้ามการสแกนฮาร์ดแวร์" ทางออก 1 elif [ $ListType == "สั้น" ]; แล้ว # พวกเขาเลือกปุ่มตัวเลือกสั้น ๆ ธง="--สั้น" อื่น # พวกเขาเลือกปุ่มตัวเลือกแบบยาว ธง="" fi # ค้นหาข้อมูลฮาร์ดแวร์ด้วยค่าที่เหมาะสมใน $Flag hwinfo $Flag | ที >(zenity --width=200 --height=100\ --title="การเรียงข้อมูล" --ความคืบหน้า \ --pulsate --text="กำลังตรวจสอบฮาร์ดแวร์..." \ --auto-kill --auto-close) >${TempFile} # แสดงข้อมูลฮาร์ดแวร์ในหน้าต่างเลื่อน zenity --width=800 --height=600 \ --title "รายละเอียดฮาร์ดแวร์" \ --text-info --filename="${TempFile}" ทางออก 0
ใช้คำสั่งนี้เพื่อทำให้สามารถเรียกใช้งานได้:
chmod +x hardware-info.sh
สคริปต์นี้สร้างไฟล์ชั่วคราว และชื่อของไฟล์ถูกเก็บไว้ในตัวแปร TempFile:
TempFile=$(mktemp)
สคริปต์ใช้ตัวเลือก --list
เพื่อสร้างหน้าต่างโต้ตอบ zenity
ที่เรียกว่าหน้าต่างโต้ตอบรายการ อักขระ "\" ที่ท้ายบรรทัดบอกให้สคริปต์ปฏิบัติต่อพวกเขาเหมือนบรรทัดยาวหนึ่งบรรทัดที่ล้อมรอบ นี่คือกระบวนการ:
- เราระบุความกว้างและความสูงของหน้าต่าง
- หน้าต่างโต้ตอบรายการรองรับคอลัมน์ ตัวเลือก
--radiolist
ทำให้คอลัมน์แรกเป็นคอลัมน์ของปุ่มตัวเลือก - เราตั้งชื่อและข้อความแจ้งสำหรับหน้าต่าง
- เราตั้งชื่อคอลัมน์แรกเป็น "เลือก" เนื้อหาของคอลัมน์นี้จะเป็นปุ่มตัวเลือก
- เราตั้งชื่อคอลัมน์ที่สองเป็น "เลือก" และเราให้เนื้อหาของคอลัมน์ที่สอง คอลัมน์นี้มีป้ายกำกับข้อความสองป้าย: "สั้น" และ "ยาว" ตัวบ่งชี้ TRUE และ FALSE หมายถึงตัวเลือก "Short" ถูกเลือกโดยค่าเริ่มต้นเมื่อหน้าต่างโต้ตอบปรากฏขึ้น
- เรากำลังจัดเก็บผลลัพธ์จากหน้าต่างโต้ตอบนี้ในตัวแปรชื่อ
ListType
ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'การสแกนฮาร์ดแวร์' \ --text 'เลือกประเภทการสแกน:' \ --column 'เลือก' \ --column 'ประเภทการสแกน' TRUE "Short" FALSE "Long"`
หากผู้ใช้กด "ยกเลิก" เราไม่จำเป็นต้องตรวจสอบค่าใน ListType,
เราก็สามารถออกได้ ถ้าเขากด "ตกลง" เราจำเป็นต้องค้นหาว่าเขาเลือกปุ่มตัวเลือก "สั้น" หรือ "ยาว" หรือไม่:
- พารามิเตอร์พิเศษ
$?
เท่ากับศูนย์หากผู้ใช้กด "ตกลง" เท่ากับหนึ่งถ้าเขากด "ยกเลิก" หรือปิดหน้าต่าง - หากมีค่าเท่ากับหนึ่ง สคริปต์จะแสดงหน้าต่างโต้ตอบข้อมูลข้อผิดพลาดและออก ถ้าเขากด "ตกลง" เราจะไปทดสอบค่าในตัวแปร
ListType
- หากตัวแปร
ListType
มีค่าเป็น "Short" สคริปต์จะตั้งค่าตัวแปรที่เรียกว่าFlag
ให้เท่ากับ "–short" - หากตัวแปร
ListType
ไม่มีค่า "Short" จะต้องเก็บค่า "Long" สคริปต์ตั้งค่าตัวแปรที่เรียกว่าFlag
กให้เท่ากับ “” ซึ่งเป็นสตริงว่าง - สคริปต์ใช้ตัวแปร
Flag
ล็กในส่วนถัดไป
ถ้า [[ $? -eq 1 ]]; แล้ว # พวกเขากดยกเลิกหรือปิดหน้าต่างโต้ตอบ zenity --error --title="สแกนถูกปฏิเสธ" --width=200 \ --text="ข้ามการสแกนฮาร์ดแวร์" ทางออก 1 elif [ $ListType == "สั้น" ]; แล้ว # พวกเขาเลือกปุ่มตัวเลือกสั้น ๆ ธง="--สั้น" อื่น # พวกเขาเลือกปุ่มตัวเลือกแบบยาว ธง="" fi
เมื่อสคริปต์รู้ว่าผู้ใช้ต้องการสแกนประเภทใด เราก็สามารถทำการสแกนข้อมูลฮาร์ดแวร์ได้:
- สคริปต์เรียกคำสั่ง
hwinfo
และส่งผ่านค่าในตัวแปรFlag
ล็ก - หาก
Flag
ล็กมี “–short” คำสั่งhwinfo
ทำการสแกนสั้นๆ หากค่าของFlag
ล็กคือ “” จะไม่มีสิ่งใดส่งผ่านไปยังhwinfo
และค่าเริ่มต้น การสแกนแบบยาวจะดำเนินการ - สคริปต์ไพพ์เอาต์พุตจาก
hwinfo
ลงในtee
tee
ส่งเอาต์พุตไปที่zenity
และTempFile
- สคริปต์สร้างหน้าต่างโต้ตอบแถบความคืบหน้า มันกำหนดความกว้างและความสูงของหน้าต่างโต้ตอบ และชื่อเรื่องและข้อความพร้อมท์
- สคริปต์ไม่สามารถทราบล่วงหน้าว่าคำสั่ง
hwinfo
จะสร้างข้อมูลได้มากน้อยเพียงใด ดังนั้นจึงไม่สามารถตั้งค่าแถบความคืบหน้าให้ก้าวหน้าอย่างถูกต้องถึง 100 เปอร์เซ็นต์ ตัวเลือก--pulsate
ทำให้กล่องโต้ตอบความคืบหน้าแสดงตัวบ่งชี้ที่เคลื่อนไหว สิ่งนี้จะแจ้งให้ผู้ใช้ทราบว่ามีบางอย่างเกิดขึ้น และเขาควรรอ - ตัวเลือก
--auto-kill
จะยุติสคริปต์หากมีผู้คลิก "ยกเลิก" - ตัวเลือก
--auto-close
ทำให้กล่องโต้ตอบความคืบหน้าปิดโดยอัตโนมัติเมื่อกระบวนการตรวจสอบเสร็จสิ้น
# ค้นหาข้อมูลฮาร์ดแวร์ด้วยค่าที่เหมาะสมใน $Flag hwinfo $Flag | ที >(zenity --width=200 --height=100\ --title="การเรียงข้อมูล" --ความคืบหน้า \ --pulsate --text="กำลังตรวจสอบฮาร์ดแวร์..." \ --auto-kill --auto-close) >${TempFile}
เมื่อการสแกน hwinfo
เสร็จสิ้น สคริปต์จะเรียก zenity
เพื่อสร้างหน้าต่างโต้ตอบข้อมูลข้อความด้วยตัวเลือก --text-info
หน้าต่างโต้ตอบข้อมูลข้อความจะแสดงเนื้อหาของไฟล์ TempFile
:
- สคริปต์กำหนดความกว้างและความสูงของหน้าต่างโต้ตอบและข้อความชื่อเรื่อง
- ตัวเลือก
--flename
ใช้เพื่ออ่านเนื้อหาของไฟล์ที่อยู่ในตัวแปรTempFIle
# แสดงข้อมูลฮาร์ดแวร์ในหน้าต่างเลื่อน zenity --width=800 --height=600 \ --title "รายละเอียดฮาร์ดแวร์" \ --text-info --filename="${TempFile}"
เมื่อผู้ใช้ปิดหน้าต่างโต้ตอบข้อมูลข้อความ สคริปต์จะออก
ทางออก 0
มาเปิดไฟกันดูเลย
./hardware-info.sh
กล่องรายการจะปรากฏขึ้น ตัวเลือก "สั้น" ถูกเลือกไว้โดยค่าเริ่มต้น
ให้เลือก "Long" แล้วคลิก "OK"
หน้าต่างความคืบหน้าจะปรากฏขึ้นพร้อมกับตัวระบุแบบเลื่อน มันยังคงอยู่บนหน้าจอจนกว่าการสแกนฮาร์ดแวร์จะเสร็จสิ้น
เมื่อการสแกนฮาร์ดแวร์เสร็จสิ้น หน้าต่างข้อความแสดงข้อมูลข้อความจะปรากฏขึ้นพร้อมรายละเอียดจากการสแกน
คลิก "ตกลง"
แม้แต่นักจัดรายการบรรทัดคำสั่งที่ตายยากยังต้องยอมรับหน้าต่างโต้ตอบ GUI สองสามหน้าต่างสามารถให้สคริปต์ Bash ที่ต่ำต้อยมีความเป็นมืออาชีพ