Як я можу запропонувати користувачам із діалоговим вікном 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 .

Щось на зразок цього: шем


Які команди я можу використовувати, щоб підказати користувачеві у вікні вибору графічного інтерфейсу, який повертає шлях файлу до командного рядка?


2
Ви можете використовувати Zenity: help.gnome.org/users/zenity/stable/file-selection.html.en
TuKsn

4
Будь ласка, не забудьте додати попередження про використання вікон GUI. Непотрібні спливаючі вікна можуть викликати лють у досвідчених користувачів.
unperson325680

5
Чому, о, чому ви хочете коли-небудь реалізувати таку набридливу "особливість"? Пам'ятайте, що якщо ми входимо в каталоги в командному рядку, ми можемо використовувати завершення вкладки, і не потрібно чекати завантаження деяких gui. Чому хтось хотів би додати графічний інтерфейс до ідеально хорошого сценарію оболонки - це не в мене.
тердон

1
Оскільки ми змішуємо парадигми, чому б не дозволити користувачеві вводити шляхи через веб-додаток?
Tulains Córdova

4
@terdon Тому що якщо ми запускаємо скрипт безпосередньо і не запускаємо в терміналі, я хочу надати графічне вікно.
Пандія

Відповіді:


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
Яд є різко розширеним видом Zenity і значною мірою його замінив з того часу, як проект Zenity затих. Я бачу, що Zenity зараз повернувся до розробки на Gnome.org (тільки Gnome3?), Але я не бачу можливості завантажити його.
DocSalvager

@DocSalvage - ця сторінка досить давня - там йдеться про наступний реліз '3.2' - у мене є версія 3.8 у вже досить старій системі Fedora 19 (з Gnome 3.8 - для кожної версії оболонки Gnome оновлюється досить багато біт gnome ( тому його, ймовірно, оновлено для 3,10 + 3,12)). Останнє також стосується звітів про помилки у 2005-2009 роках. Ви можете отримати останню стабільну версію (знову 3.8) від репортажу Ubuntu - пакети.ubuntu.com/trusty/ zenity . Ви також повинні бути в змозі знайти скомпільовані версії Yad тут .
Вільф

Яд виглядає досить непогано - у нього більше варіантів, ніж зен :)
Вільф

1
@Wilf Так, яд - це Zenity на стероїдах. Як тільки ви впораєтеся з цим, він хитається, як це так гнучко. Я навернений. Я поцупив (не міг протистояти цьому, вибачте) відповідь на питання ОП внизу, btw.
Скубі-2,

@ Scooby-2 додав інструкції з встановлення для відповіді (тому майбутнім користувачам не потрібно робити коментарі)
Wilf

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
Хоча це правильне альтернативне рішення, але воно не надає вікна графічного інтерфейсу, як згадувалося в питанні!
Пандія,

2
Я знаю, але хтось інший може вважати це корисним. Я розмістив скріншот, щоб уникнути плутанини.
kraxor

7
І, якщо чесно, це кваліфікується як GUI IMHO.
kraxor

3
Поширена лінія між GUI та TUI (текстовий інтерфейс) - це розмір "атома": це піксель чи символ?
unperson325680

3
Приємна відповідь - ширина і висота деяких терміналів визначаються такими змінними, як $LINESі $COLUMNS- тому ви запускаєте, $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))щоб він заповнив вікно термінала / екрана.
Вільф

5

Я знаю, що це 8 місяців, а також, що на питання ОП було відповідено. Однак яд згадується, але жодного прикладу не пропонується. Ось моє рішення з використанням 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 у цикл for, встановлюючи змінну $locationна sourceперший прохід і destinationна другий. Вихід розміщується в масиві, selection[]для якого змінна iвикористовується як індекс. Це встановлюється на 0 на початку та збільшується з кожним проходом. Отже, джерело зберігається як ${selection[1]}і місце призначення ${selection[2]}.

DIR = "/ home" у першому рядку встановлює діалогове вікно за замовчуванням. Параметри команди yad можна знайти з терміналу, ввівши yad --help.

скріншот yad


2

Ось найкоротше (і найкраще) рішення відповіді: Yadнадається точний варіант, як zenityі:

yad --file-selection --directory

Це відкриває діалогове вікно вибору каталогу. Без додаткового аргументу --directoryзамість цього буде діалог вибору файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.