Pertanyaan Bagaimana cara mengarahkan pengguna dengan kotak dialog GUI untuk memilih jalur file / direktori, melalui baris perintah?


Misalkan saya memiliki skrip seperti ini:

(Contoh ini menggambarkan kasus penggunaan rysnc)

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

Idenya di sini adalah meminta pengguna untuk memasukkan direktori "Sumber" dan "Tujuan" agar rsync dapat berfungsi. Seperti, pengguna harus masukkan secara manual  /path/to/directory/ melalui baris perintah.

Sebagai gantinya, Saya ingin meminta pengguna untuk memasuki jalur antarmuka GUI.

Sesuatu seperti ini: screem


Perintah apa yang bisa saya gunakan untuk meminta pengguna dengan Jendela pemilihan GUI yang mengembalikan jalur file ke baris perintah?


12
2018-06-26 08:49


asal


Anda dapat menggunakan Zenity: help.gnome.org/users/zenity/stable/file-selection.html.en - TuKsn
Harap diingat untuk menambahkan peringatan tentang penggunaan jendela GUI. Jendela yang tidak perlu muncul dapat menyebabkan kemarahan pada pengguna tingkat lanjut. - progo
Mengapa, mengapa Anda ingin menerapkan "fitur" yang menyebalkan itu? Ingat bahwa jika kita memasuki direktori pada baris perintah kita dapat menggunakan penyelesaian tab, dan tidak perlu menunggu beberapa gui untuk memuat. Mengapa ada yang ingin menambahkan GUI ke skrip shell yang sangat baik adalah di luar saya. - terdon♦
Karena kita mencampur paradigma, mengapa tidak membuat pengguna memasukkan jalur melalui aplikasi web? - Tulains Córdova
@terdon Karena jika kita menjalankan skrip secara langsung & tidak Jalankan di terminal maka saya ingin memberikan jendela GUI. - Pandya


Jawaban:


Anda dapat menggunakan ini untuk file:

zenity --file-selection

dan ini untuk folder:

zenity --file-selection --directory

untuk penggunaan, jalankan:

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

Umumnya ini cocok dengan tema saat ini (untuk pengelola jendela GTK), pada mesin saya dengan versi modded Zukitwo 3.8 terlihat seperti ini:

Salah satu cara menggunakannya adalah seperti ini:

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

Yang akan menghasilkan you selected /path/to/file.

Anda juga dapat menggunakan opsi untuk menetapkan judul yang sesuai, dan direktori yang dimulai dengan - Dengan kasus penggunaan rsync Anda, misalnya:

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

Untuk file, Anda juga dapat menentukan jenis file yang akan dipilih - misalnya:

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

CATATAN: Anda juga bisa menggunakan YAD, garpu Zenity yang memiliki lebih banyak fitur.

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

Sumber

Untuk sebagian besar Anda dapat menggunakannya dengan cara yang sama - untuk peramban file:

yad --file-selection

dan untuk halaman bantuan:

yad --help-all

Meskipun pada saat itu (sekitar versi 26?), Belum diperbarui untuk mencocokkan antarmuka GTK 3.14+ yang baru (zenity) - ia memiliki lebih banyak fitur, tetapi periksa kompatibilitas (berdasarkan dokumentasi, ia harus bekerja pada GTK +> = 2.16. 0


31
2018-06-26 08:57



Yad adalah garpu Zenity yang ditingkatkan secara dramatis dan sebagian besar telah menggantikannya sejak proyek Zenity menjadi tidak aktif. saya melihat bahwa Zenity sekarang kembali dalam pengembangan di Gnome.org (hanya Gnome3?) tapi saya tidak melihat cara mengunduhnya. - DocSalvager
@DocSalvage - halaman itu cukup kuno - mengatakan rilis berikutnya '3.2' - Saya memiliki versi 3.8 pada sistem Fedora 19 yang kini cukup lawas (dengan Gnome 3.8 - cukup beberapa bit gnome diperbarui untuk setiap versi Gnome shell ( jadi mungkin sudah diperbarui untuk 3,10 + 3,12)). Terakhir berurusan dengan laporan bug dari 2005-2009 juga. Anda bisa mendapatkan versi stabil terbaru (3,8 lagi) dari repositori Ubuntu - packages.ubuntu.com/trusty/zenity. Anda juga harus dapat menemukan versi Yad yang telah dikompilasi sini. - Wilf
Yad terlihat cukup bagus - ia memiliki lebih banyak pilihan daripada zenity :) - Wilf
@Wilf Ya, yad adalah Zenity pada steroid. Setelah Anda bisa mengatasinya, itu bebatuan karena itu sangat fleksibel. Saya adalah orang yang insaf. Saya yadded (tidak bisa menahan itu, maaf) tanggapan atas pertanyaan OP di bawah ini, btw. - Scooby-2
@ Scooby-2 menambahkan instruksi pemasangan keren (jadi pengguna masa depan tidak perlu melakukan komentar) - Wilf


Sekedar catatan saja, Anda bisa menggunakannya dialog untuk solusi antarmuka pengguna berbasis teks (TUI).

Sintaksis:

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

Contoh:

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

Outputnya akan seperti ini:

Example

Seperti yang ditunjukkan oleh @Wilf, Anda dapat menggunakan $LINES dan $COLUMNS variabel untuk membuatnya mengisi terminal:

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

17
2018-06-26 09:12



Padahal itu solusi alternatif yang tepat tapi itu tidak menyediakan jendela GUI sebagaimana disebutkan dalam pertanyaan! - Pandya
Saya tahu, tetapi orang lain mungkin menganggapnya berguna. Saya memposting tangkapan layar untuk menghindari kebingungan. - kraxor
Dan, untuk bersikap adil, itu memenuhi syarat sebagai IMHO GUI. - kraxor
Garis yang umum digunakan antara GUI dan TUI (UI tekstual) adalah ukuran "atom": apakah itu sebuah pixel atau karakter? - progo
Jawaban bagus - lebar dan tinggi beberapa terminal ditentukan oleh variasi seperti $LINES dan $COLUMNS - jadi kamu lari $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10)) untuk membuatnya mengisi terminal / jendela layar. - Wilf


Saya tahu ini adalah 8 bulan dan juga pertanyaan OP telah dijawab. Namun, Anda telah disebutkan tetapi tidak ada contoh yang ditawarkan. Inilah solusi saya menggunakan 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]}\""

Cara kerjanya seperti ini. Kami menempatkan yad dalam lingkaran, pengaturan variabel $location untuk source untuk operan pertama dan destination untuk kedua. Output ditempatkan dalam array selection[] untuk variabel mana i digunakan sebagai indeks. Ini diatur ke 0 di awal dan bertambah dengan setiap laluan. Oleh karena itu sumbernya disimpan sebagai ${selection[1]} dan tujuan ${selection[2]}.

DIR = "/ home" pada baris pertama mengatur dialog default. Opsi perintah yad dapat ditemukan dari terminal dengan mengetik yad --help.

yad screenshot


3
2018-03-17 19:27



Ini sangat luar biasa! Terima kasih sudah berbagi - MrMesees


Inilah solusi terpendek (dan terbaik) untuk jawabannya: Yad menyediakan opsi yang tepat seperti zenity tidak:

yad --file-selection --directory

Ini membuka dialog pemilihan direktori. Tanpa argumen tambahan --directory itu akan menjadi dialog pemilihan file sebagai gantinya.


0
2018-05-31 13:47