ฉันจะแจ้งให้ผู้ใช้ด้วยกล่องโต้ตอบ GUI เพื่อเลือกเส้นทางไฟล์ / ไดเรกทอรีผ่านทางบรรทัดคำสั่งได้อย่างไร


16

สมมติว่าฉันมีสคริปต์เช่นนี้:

(ตัวอย่างแสดงกรณีการใช้ rysnc)

#!/bin/bash
echo -n "Enter Source Directory:"
read srcdir
echo -n "Enter Destination Directory:"
read dstdir
rsync -av --delete "$srcdir" "$dstdir"

แนวคิดที่นี่คือการแจ้งให้ผู้ใช้ป้อนไดเรกทอรี "ต้นทาง" และ "ปลายทาง" เพื่อให้ rsync ทำงานด้วย ดังเช่นที่ผู้ใช้จะต้องป้อนด้วยตนเอง /path/to/directory/ผ่านทางบรรทัดคำสั่ง

แต่ผมต้องการที่จะแจ้งให้ผู้ใช้เพื่อเข้าสู่เส้นทางผ่านอินเตอร์เฟซแบบ GUI

บางสิ่งเช่นนี้ Screem


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


2
คุณสามารถใช้ Zenity: help.gnome.org/users/zenity/stable/file-selection.html.en
TuKsn

4
โปรดอย่าลืมเพิ่มคำเตือนเกี่ยวกับการใช้งานหน้าต่าง GUI การเปิดหน้าต่างที่ไม่จำเป็นขึ้นอาจทำให้ผู้ใช้ขั้นสูงเดือดดาล
unperson325680

5
ทำไมโอ๋ทำไมคุณถึงอยากจะใช้คุณสมบัติที่น่ารำคาญ? โปรดจำไว้ว่าถ้าเราป้อนไดเรกทอรีที่บรรทัดคำสั่งเราสามารถใช้การทำให้แท็บสมบูรณ์และไม่จำเป็นต้องรอให้ gui โหลด ทำไมทุกคนที่ต้องการเพิ่ม GUI ลงในเชลล์สคริปต์ที่ดีเลิศนั้นอยู่นอกเหนือฉัน
terdon

1
เนื่องจากเรากำลังผสมกระบวนทัศน์ทำไมไม่ให้ผู้ใช้ป้อนเส้นทางผ่านเว็บแอป
Tulains Córdova

4
@terdon เพราะถ้าเราเรียกใช้สคริปต์โดยตรง & ไม่เรียกใช้ในเทอร์มินัลฉันต้องการให้หน้าต่าง GUI
Pandya

คำตอบ:


34

คุณสามารถใช้สิ่งนี้สำหรับไฟล์:

zenity --file-selection

และนี่สำหรับโฟลเดอร์:

zenity --file-selection --directory

สำหรับการใช้งานให้เรียกใช้:

zenity --help-general
zenity --help-file-selection

โดยทั่วไปแล้วจะตรงกับชุดรูปแบบปัจจุบัน (สำหรับตัวจัดการหน้าต่าง GTK อยู่แล้ว) บนเครื่องของฉันที่มี Zukitwo 3.8 รุ่นดัดแปลงแล้วดูเหมือนว่านี้:

วิธีหนึ่งในการใช้มันเป็นเช่นนี้:

echo "you selected $(zenity --file-selection)"

you selected /path/to/fileซึ่งจะส่งผลให้

นอกจากนี้คุณยังสามารถใช้ตัวเลือกเพื่อตั้งชื่อที่เหมาะสมและไดเรกทอรีนั้นเริ่มต้นด้วย - กรณีใช้ rsync ของคุณตัวอย่างเช่น:

zenity --file-selection --directory --title="Choose rsync source directory" --filename=$HOME/Desktop/

สำหรับไฟล์คุณสามารถระบุประเภทไฟล์ที่จะเลือก - เช่น:

zenity --file-selection --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file"

หมายเหตุ:คุณสามารถใช้YADซึ่งเป็นทางแยกของ Zenity ที่มีคุณสมบัติมากมาย

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

แหล่ง

ส่วนใหญ่คุณสามารถใช้วิธีเดียวกัน - สำหรับเบราว์เซอร์ไฟล์:

yad --file-selection

และสำหรับหน้าความช่วยเหลือ:

yad --help-all

แม้ว่าในเวลานั้น (ประมาณรุ่น 26?) มันไม่ได้รับการปรับปรุงให้ตรงกับ GTK 3.14+ รุ่นใหม่ (มี zenity) - มีคุณสมบัติเพิ่มเติม แต่ตรวจสอบความเข้ากันได้ (ตามเอกสารที่ควรใช้กับ GTK +> = 2.16 0


2
Yadเป็นทางแยกที่เพิ่มขึ้นอย่างมากของ Zenity และได้แทนที่มันเป็นส่วนใหญ่ตั้งแต่โครงการ Zenity ไปเฉยๆ ฉันเห็นว่าZenity กลับมาสู่การพัฒนาที่ Gnome.org (Gnome3 เท่านั้น)แต่ฉันไม่เห็นว่าจะดาวน์โหลด
DocSalvager

@DocSalvage - หน้านั้นค่อนข้างเก่า - มันบอกว่ารุ่นถัดไป '3.2' - ฉันมีรุ่น 3.8 บนระบบ Fedora 19 ที่ค่อนข้างเก่าตอนนี้ (พร้อม Gnome 3.8 - มีการปรับปรุง gnome หลายบิตในแต่ละเชลล์ () ดังนั้นอาจมีการอัปเดตสำหรับ 3.10 + 3.12)) มันเกี่ยวกับรายงานข้อผิดพลาดล่าสุดระหว่าง 2005-2009 เช่นกัน คุณจะได้รับรุ่นล่าสุดที่มีเสถียรภาพ (3.8 อีกครั้ง) จาก Repos อูบุนตู - packages.ubuntu.com/trusty/zenity นอกจากนี้คุณควรจะสามารถหาคอมไพล์รุ่น Yad ที่นี่
วิลฟ์

Yad ดูค่อนข้างดี - มันมีตัวเลือกมากกว่า zenity :)
วิลฟ์

1
@ Wilf ใช่แล้ว yad คือ Zenity บนเตียรอยด์ เมื่อคุณจับมันได้มันก็จะลื่นเมื่อมันยืดหยุ่นได้ ฉันเป็นผู้เปลี่ยนใจเลื่อมใส ฉันไม่พอใจ (ไม่สามารถต้านทานได้ขอโทษ) ตอบคำถาม OPs ด้านล่าง btw
Scooby-2

@ Scooby-2 เจ๋งเพิ่มคำแนะนำในการติดตั้งที่จะตอบ (ดังนั้นผู้ใช้ในอนาคตไม่จำเป็นต้องแสดงความคิดเห็น)
วิลฟ์

19

สำหรับบันทึกคุณสามารถใช้dialogสำหรับโซลูชันส่วนต่อประสานกับผู้ใช้แบบข้อความ (TUI)

ไวยากรณ์:

dialog --title "text" --fselect /path/to/dir height width

ตัวอย่าง:

FILE=$(dialog --stdout --title "Please choose a file" --fselect $HOME/ 14 48)
echo "${FILE} file chosen."

ผลลัพธ์จะเป็นดังนี้:

ตัวอย่าง

ตามที่ระบุโดย @Wilf คุณสามารถใช้ตัวแปร$LINESและ$COLUMNSเพื่อเติมเต็มเทอร์มินัล:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))

1
แม้ว่ามันจะเป็นทางเลือกที่ถูกต้อง แต่มันไม่มีหน้าต่าง GUIตามที่กล่าวไว้ในคำถาม!
Pandya

2
ฉันรู้ แต่คนอื่นอาจเห็นว่ามีประโยชน์ ฉันโพสต์ภาพหน้าจอเพื่อหลีกเลี่ยงความสับสน
kraxor

7
และเพื่อความยุติธรรมมันมีคุณสมบัติเป็น GUI IMHO
kraxor

3
เส้นที่ใช้กันทั่วไประหว่าง GUI และ TUI (textual UI) คือขนาดของ "atom": มันเป็นพิกเซลหรือตัวอักษร?
unperson325680

3
คำตอบที่ดี - ความกว้างและความสูงของเทอร์มินัลบางตัวถูกกำหนดโดย varibles เช่น$LINESและ$COLUMNS- ดังนั้นคุณจึงเรียกใช้$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))เพื่อเติมเต็มหน้าต่างเทอร์มินัล / หน้าจอ
Wilf

5

ฉันรู้ว่านี่คือ 8 เดือนและยังตอบคำถามของ OP อย่างไรก็ตามมีการพูดถึง yad แต่ไม่มีตัวอย่างที่เสนอ นี่คือทางออกของฉันโดยใช้ yad

DIR="/home" \
i=0;for location in source destination
do
((i++));selection[$i]=$(yad --center \
--width 350 \
--form \
--title="yad example" \
--text="Select $location directory" \
--field=:LBL "" \
--field=Path:DIR "$DIR" \
--separator='' )
done;\
echo "Command to run is \"rsync -av --delete ${selection[1]} ${selection[2]}\""

วิธีการทำงานเป็นเช่นนี้ เราใส่ Yad ในสำหรับวง, การตั้งค่าตัวแปร$locationไปsourceสำหรับครั้งแรกผ่านและdestinationเป็นครั้งที่สอง เอาท์พุทจะถูกวางไว้ในอาร์เรย์selection[]ที่ใช้ตัวแปรiเป็นดัชนี นี้ถูกตั้งค่าเป็น 0 ที่เริ่มต้นและเพิ่มขึ้นกับแต่ละผ่าน ดังนั้นแหล่งที่มาจะถูกบันทึกเป็น และปลายทาง${selection[1]}${selection[2]}

DIR = "/ home" ในบรรทัดแรกตั้งค่าเริ่มต้นการโต้ตอบ ตัวเลือกคำสั่ง Yad yad --helpสามารถพบได้จากขั้วโดยการพิมพ์

ภาพหน้าจอ yad


2

นี่คือทางออกที่สั้นที่สุด (และดีที่สุด) สำหรับคำตอบ: Yadให้ตัวเลือกที่แน่นอนเหมือนกับzenity:

yad --file-selection --directory

เปิดไดอะล็อกการเลือกไดเร็กทอรี หากไม่มีอาร์กิวเมนต์เพิ่มเติม--directoryจะเป็นการโต้ตอบเลือกไฟล์แทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.