Come posso richiedere agli utenti con una finestra di dialogo della GUI di scegliere il percorso di file / directory, tramite la riga di comando?


15

Supponiamo che io abbia una sceneggiatura come questa:

(L'esempio mostra un caso d'uso in rysnc)

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

L'idea qui è di chiedere all'utente di inserire le directory "Origine" e "Destinazione" per far funzionare rsync. Così com'è, l'utente dovrà inserire manualmente /path/to/directory/ tramite la riga di comando.

Invece , voglio chiedere all'utente di inserire i percorsi attraverso un'interfaccia GUI .

Qualcosa come questo: screem


Quali comandi posso usare per richiedere all'utente una finestra di selezione della GUI che restituisca il percorso del file alla riga di comando?



4
Ricorda di aggiungere un avviso sull'utilizzo delle finestre della GUI. La comparsa di finestre non necessarie può provocare rabbia per gli utenti esperti.
unperson325680,

5
Perché, oh, perché mai vorresti implementare una "caratteristica" così fastidiosa? Ricorda che se inseriamo le directory dalla riga di comando, possiamo usare il completamento della scheda e non è necessario attendere il caricamento di alcune gui. Perché qualcuno vorrebbe aggiungere una GUI a uno script di shell perfettamente buono è al di là di me.
terdon,

1
Dato che stiamo mescolando paradigmi, perché non indurre l'utente a inserire i percorsi tramite un'app Web?
Tulains Córdova,

4
@terdon Perché se eseguiamo lo script direttamente e non eseguiamo nel terminale, voglio fornire la finestra della GUI.
Pandya,

Risposte:


33

Puoi usarlo per i file:

zenity --file-selection

e questo per le cartelle:

zenity --file-selection --directory

per l'utilizzo, eseguire:

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

Generalmente corrisponde al tema attuale (comunque per i window manager GTK), sulla mia macchina con una versione modificata di Zukitwo 3.8 sembra così:

Un modo di usarlo è così:

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

Il che comporterebbe you selected /path/to/file.

Puoi anche usare le opzioni per impostare un titolo appropriato e la directory in cui inizia - Con il tuo caso d'uso rsync, ad esempio:

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

Per i file, puoi anche specificare un tipo di file da selezionare, ad esempio:

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

NOTA: puoi anche usare YAD , un fork di Zenity che ha molte più funzionalità.

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

fonte

Per la maggior parte puoi usarlo allo stesso modo - per il browser di file:

yad --file-selection

e per la pagina di aiuto:

yad --help-all

Anche se al momento (intorno alla versione 26?), Non era stato aggiornato per corrispondere alla nuova interfaccia GTK 3.14+ (zenity aveva) - ha più funzionalità, ma controlla la compatibilità (in base alla documentazione dovrebbe funzionare su GTK +> = 2.16. 0


2
Yad è un fork drammaticamente migliorato dello Zenity e lo ha ampiamente sostituito da quando il progetto Zenity è andato in letargo. Vedo che Zenity è tornato in sviluppo su Gnome.org (solo Gnome3?) Ma non vedo alcun modo per scaricarlo.
DocSalvager,

@DocSalvage - quella pagina è piuttosto antica - dice la prossima versione '3.2' - Ho la versione 3.8 su un sistema Fedora 19 ora abbastanza vecchio (con Gnome 3.8 - alcuni bit di gnome sono aggiornati per ogni versione della shell Gnome ( quindi è stato probabilmente aggiornato per 3.10 + 3.12)). Si occupa anche delle segnalazioni di bug del 2005-2009. È possibile ottenere l'ultima versione stabile (di nuovo 3.8) dai repository di Ubuntu - pacchetti.ubuntu.com/trusty/zenity . Dovresti anche essere in grado di trovare le versioni compilate di Yad qui .
Wilf,

Yad ha un bell'aspetto - ha più opzioni dello zenity :)
Wilf

1
@Wilf Sì, yad è Zenity sugli steroidi. Una volta che lo affronti, oscilla in quanto è così flessibile. Sono un convertito. Ho risposto (non potevo resistere a quello, scusa) una risposta alla domanda dei PO qui sotto, tra l'altro.
Scooby-2,

@ Scooby-2 cool aggiunte istruzioni di installazione per rispondere (quindi i futuri utenti non devono fare commenti)
Wilf

19

Solo per la cronaca, è possibile utilizzare dialogper una soluzione TUI (Text-based User Interface).

Sintassi:

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

Esempio:

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

L'output sarà qualcosa del genere:

Esempio

Come sottolineato da @Wilf, è possibile utilizzare le variabili $LINESe $COLUMNSper riempire il terminale:

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

1
Sebbene sia la giusta soluzione alternativa ma non fornisce la finestra della GUI come menzionato nella domanda!
Pandya,

2
Lo so, ma qualcun altro potrebbe trovarlo utile. Ho pubblicato lo screenshot per evitare qualsiasi confusione.
kraxor,

7
E, per essere onesti, si qualifica come IMHO GUI.
kraxor,

3
La linea comunemente usata tra GUI e TUI (UI testuale) è la dimensione dell '"atomo": è un pixel o un carattere?
unperson325680,

3
Bella risposta - la larghezza e l'altezza di alcuni terminali sono definite da variabili come $LINESe $COLUMNS- quindi corri $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))per riempire la finestra del terminale / schermo.
Wilf,

5

So che ha 8 mesi e che alla domanda del PO è stata data una risposta. Tuttavia, yad è stato menzionato ma non è stato offerto alcun esempio. Ecco la mia soluzione usando 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]}\""

Funziona così. Inseriamo yad in un ciclo for, impostando la variabile $locationsu sourceper il primo passaggio e destinationper il secondo. L'output viene inserito nella matrice selection[]per la quale la variabile iviene utilizzata come indice. Questo è impostato su 0 all'inizio e incrementato con ogni passaggio. Quindi la fonte viene salvata come ${selection[1]}e la destinazione ${selection[2]}.

DIR = "/ home" sulla prima riga imposta la finestra di dialogo predefinita. Le opzioni del comando yad possono essere trovate dal terminale digitando yad --help.

screenshot di yad


2

Ecco la soluzione più breve (e migliore) alla risposta: Yadfornisce l'opzione esatta proprio come zenityfa:

yad --file-selection --directory

Questo apre una finestra di selezione della directory. Senza l'argomento aggiuntivo --directorysarà invece una finestra di dialogo per la selezione dei file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.