Как предложить пользователям с помощью диалогового окна с графическим интерфейсом пользователя выбрать путь к файлу / каталогу через командную строку?


16

Предположим, у меня есть такой скрипт:

(В примере показан вариант использования rysnc)

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

Идея заключается в том, чтобы предложить пользователю ввести каталоги «Source» и «Destination» для работы с rsync. Таким образом, пользователь должен будет войти вручную /path/to/directory/ через командную строку.

Вместо этого я хочу предложить пользователю ввести пути через графический интерфейс .

Что-то вроде этого: Screem


Какие команды можно использовать, чтобы запросить у пользователя окно выбора графического интерфейса, которое возвращает путь к файлу в командной строке?


2
Вы можете использовать Zenity
— TuKsn

4
Пожалуйста, не забудьте добавить предупреждение об использовании окон GUI. Ненужные всплывающие окна могут вызвать ярость у опытных пользователей.
— unperson325680

5
Почему, о-о, вы бы хотели реализовать такую ​​раздражающую «функцию»? Помните, что если мы вводим каталоги в командной строке, мы можем использовать завершение табуляции, и не нужно ждать загрузки некоторого графического интерфейса. Почему кто-то захочет добавить графический интерфейс в совершенно хороший сценарий оболочки, мне не понятно.
— Тердон

1
Поскольку мы смешиваем парадигмы, почему бы не заставить пользователя вводить пути через веб-приложение?
— Тулаинс Кордова

4
@terdon Потому что если мы запускаем скрипт напрямую, а не запускаем в терминале, то я хочу предоставить окно графического интерфейса.
— 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 обновляются для каждой версии оболочки Gnome ( так что, вероятно, его обновили до 3.10 + 3.12)). Последнее также касается отчетов об ошибках за 2005-2009 гг. Вы можете получить последнюю стабильную версию (снова 3.8) из репозитория Ubuntu - packages.ubuntu.com/trusty/zenity . Вы также можете найти скомпилированные версии Yad здесь .
— Уилф

Яд выглядит неплохо - у него больше возможностей, чем в зените :)
— Уилф

1
@Wilf Да, Яд - это Зениты на стероидах. Как только вы справляетесь с этим, он становится невероятно гибким. Я новообращенный. Я дал (не мог сопротивляться этому, извините) ответ на вопрос OPs ниже, между прочим.
— Скуби-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 (текстовый интерфейс) имеет размер «атома»: это пиксель или символ?
— unperson325680

3
Хороший ответ - ширина и высота некоторых терминалов определяется переменными, такими как $LINESи $COLUMNS- поэтому вы запускаете, $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))чтобы заполнить окно терминала / экрана.
— Уилф

5

Я знаю, что это 8 месяцев, а также на вопрос ОП был дан ответ. Тем не менее, Яд был упомянут, но ни один пример не был предложен. Вот мое решение с использованием Яд.

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]}\""

Как это работает, вот так. Ставим йад в цикле, установив переменную $locationв sourceтечение первого прохода и destinationдля второго. Вывод помещается в массив, selection[]для которого переменная iиспользуется в качестве индекса. Это установлено в 0 в начале и увеличивается с каждым проходом. Следовательно источник сохраняется как ${selection[1]}и место назначения ${selection[2]}.

DIR = "/ home" в первой строке устанавливает диалог по умолчанию. Опции команды yad можно найти в терминале, набрав yad --help.

скриншот Яда


2

Вот самое короткое (и лучшее) решение для ответа: Yadпредоставляет точную опцию, как это zenityделает:

yad --file-selection --directory

Откроется диалоговое окно выбора каталога. Без дополнительного аргумента --directoryэто будет диалог выбора файла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.