Jak zachęcić użytkowników za pomocą okna dialogowego GUI do wybrania ścieżki pliku / katalogu za pomocą wiersza polecenia?


16

Załóżmy, że mam taki skrypt:

(Przykład przedstawia przypadek użycia rysnc)

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

Chodzi o to, aby zachęcić użytkownika do wprowadzenia katalogów „Źródło” i „Miejsce docelowe”, aby rsync mógł z nim pracować. W tej chwili użytkownik będzie musiał wprowadzić ręcznie /path/to/directory/ za pomocą wiersza polecenia.

Zamiast tego chcę zachęcić użytkownika do wprowadzenia ścieżek przez interfejs GUI .

Coś takiego: wrzask


Jakich poleceń mogę użyć do wyświetlenia monitu w oknie wyboru GUI, które zwraca ścieżkę pliku do wiersza poleceń?



4
Pamiętaj, aby dodać ostrzeżenie o korzystaniu z okien GUI. Niepotrzebne wyskakujące okna mogą wywoływać gniew wśród zaawansowanych użytkowników.
unperson325680

5
Dlaczego, och, dlaczego miałbyś kiedykolwiek chcieć wdrożyć taką irytującą „funkcję”? Pamiętaj, że jeśli wprowadzimy katalogi w wierszu poleceń, możemy użyć uzupełniania tabulacji i nie musimy czekać na załadowanie niektórych GUI. Dlaczego ktoś chciałby dodać GUI do idealnie dobrego skryptu powłoki, jest dla mnie czymś więcej.
terdon

1
Ponieważ miksujemy paradygmaty, dlaczego nie skłonić użytkownika do wprowadzenia ścieżek za pośrednictwem aplikacji internetowej?
Tulains Córdova

4
@terdon Ponieważ jeśli uruchamiamy skrypt bezpośrednio i nie uruchamiamy go w terminalu , chcę wyświetlić okno GUI.
Pandya

Odpowiedzi:


34

Możesz użyć tego do plików:

zenity --file-selection

i to dla folderów:

zenity --file-selection --directory

do użytku uruchom:

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

Ogólnie pasuje do aktualnego motywu (w każdym razie dla menedżerów okien GTK), na mojej maszynie ze zmodyfikowaną wersją Zukitwo 3.8 wygląda to tak:

Jednym ze sposobów korzystania z tego jest:

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

Co spowodowałoby you selected /path/to/file.

Możesz także użyć opcji, aby ustawić odpowiedni tytuł i katalog, w którym zaczyna się - W przypadku użycia rsync, na przykład:

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

W przypadku plików możesz również określić typ pliku do wyboru - np .:

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

UWAGA: Możesz także użyć YAD , widelca Zenity, który ma wiele innych funkcji.

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

Źródło

W przeważającej części możesz używać go w ten sam sposób - w przeglądarce plików:

yad --file-selection

i na stronie pomocy:

yad --help-all

Chociaż w tym czasie (około wersji 26?), Nie został zaktualizowany, aby pasował do nowego interfejsu GTK 3.14+ (miał zenity) - ma więcej funkcji, ale sprawdź kompatybilność (na podstawie dokumentacji powinien działać na GTK +> = 2.16. 0


2
Yad jest znacznie ulepszonym widelcem Zenity i w dużej mierze go zastąpił, odkąd projekt Zenity stał się uśpiony. Widzę, że Zenity jest teraz w fazie rozwoju na Gnome.org (tylko Gnome3?), Ale nie widzę żadnego sposobu, aby go pobrać.
DocSalvager,

@DocSalvage - ta strona jest dość stara - mówi następna wersja „3.2” - Mam wersję 3.8 na dość starym systemie Fedora 19 (z Gnome 3.8 - całkiem sporo bitów gnome jest aktualizowanych dla każdej wersji powłoki Gnome ( więc prawdopodobnie został zaktualizowany do wersji 3.10 + 3.12)). Ostatnio zajmuje się również raportami błędów z lat 2005-2009. Najnowszą stabilną wersję (ponownie 3.8) możesz pobrać z repozytoriów Ubuntu - packages.ubuntu.com/trusty/zenity . Należy także być w stanie znaleźć skompilowane wersje Yad tutaj .
Wilf

Yad wygląda całkiem dobrze - ma więcej opcji niż zenity :)
Wilf

1
@ Wilf Tak, yad to Zenity na sterydach. Gdy się z tym poradzisz, kołysze się, ponieważ jest tak elastyczny. Jestem nawrócony. Odpowiedziałem (nie mogłem się oprzeć, przepraszam) odpowiedź na poniższe pytanie PO, btw.
Scooby-2

@ Scooby-2 fajne dodane instrukcje instalacji, aby odpowiedzieć (aby w przyszłości użytkownicy nie musieli robić komentarzy)
Wilf

19

Dla przypomnienia możesz użyć dialogrozwiązania opartego na tekstowym interfejsie użytkownika (TUI).

Składnia:

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

Przykład:

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

Wynik będzie mniej więcej taki:

Przykład

Jak wskazał @Wilf, możesz użyć zmiennych $LINESi, $COLUMNSaby wypełnić terminal:

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

1
Chociaż jest to właściwe rozwiązanie alternatywne, ale nie zapewnia okna GUI, jak wspomniano w pytaniu!
Pandya

2
Wiem, ale ktoś inny może uznać to za przydatne. Opublikowałem zrzut ekranu, aby uniknąć nieporozumień.
kraxor

7
I, szczerze mówiąc, kwalifikuje się jako GUI IMHO.
kraxor

3
Powszechnie stosowana linia między GUI a TUI (tekstowy interfejs użytkownika) ma rozmiar „atomu”: czy jest to piksel czy znak?
unperson325680

3
Dobra odpowiedź - szerokość i wysokość niektórych terminali jest definiowana przez zmienne, takie jak $LINESi $COLUMNS- więc biegniesz, $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))aby wypełnić okno terminala / ekranu.
Wilf

5

Wiem, że ma to 8 miesięcy, a także odpowiedź na pytanie PO. Jednak wspomniano o yadzie, ale nie podano żadnego przykładu. Oto moje rozwiązanie za pomocą 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]}\""

Tak to działa. Umieszczamy yad w pętli for, ustawiając zmienną $locationna sourcedla pierwszego przejścia i destinationdla drugiego. Dane wyjściowe są umieszczane w tablicy, selection[]dla której zmienna ijest używana jako indeks. Jest on ustawiany na 0 na początku i zwiększany z każdym przejściem. Dlatego źródło jest zapisywane jako ${selection[1]}i miejsce docelowe ${selection[2]}.

DIR = „/ home” w pierwszym wierszu ustawia domyślne okno dialogowe. Opcje polecenia yad można znaleźć w terminalu, wpisując yad --help.

zrzut ekranu


2

Oto najkrótsze (i najlepsze) rozwiązanie odpowiedzi: Yadzapewnia dokładnie taką samą opcję jak zenity:

yad --file-selection --directory

Otworzy się okno wyboru katalogu. Bez dodatkowego argumentu --directorybędzie to okno dialogowe wyboru pliku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.