Làm cách nào để nhắc người dùng với hộp thoại GUI chọn đường dẫn tệp / thư mục, thông qua dòng lệnh?


15

Giả sử tôi có một kịch bản như thế này:

(Ví dụ mô tả trường hợp sử dụng rysnc)

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

Ý tưởng ở đây là nhắc người dùng nhập các thư mục "Nguồn" và "Đích" để rsync hoạt động. Như vậy, người dùng sẽ phải nhập thủ công /path/to/directory/ thông qua dòng lệnh.

Thay vào đó , tôi muốn nhắc người dùng nhập các đường dẫn thông qua giao diện GUI .

Một cái gì đó như thế này: screem


Những lệnh nào tôi có thể sử dụng để nhắc người dùng với cửa sổ chọn GUI trả về đường dẫn tệp đến dòng lệnh?


2
Bạn có thể sử dụng Zenity: help.gnome.org/users/zenity/urdy/file-selection.html.en
TuKsn

4
Hãy nhớ để thêm cảnh báo về việc sử dụng các cửa sổ GUI. Các cửa sổ không cần thiết bật lên có thể gây ra cơn thịnh nộ cho người dùng cao cấp.
unperson325680

5
Tại sao, ồ tại sao bạn lại muốn thực hiện một "tính năng" khó chịu như vậy? Hãy nhớ rằng nếu chúng ta nhập các thư mục tại dòng lệnh, chúng ta có thể sử dụng hoàn thành tab và không cần đợi một số gui tải. Tại sao bất cứ ai cũng muốn thêm GUI vào một kịch bản shell hoàn toàn tốt nằm ngoài tôi.
terdon

1
Vì chúng ta đang trộn các mô hình, tại sao không bắt người dùng nhập các đường dẫn qua ứng dụng web?
Tulains Córdova

4
@terdon Vì nếu chúng tôi chạy script trực tiếp & không Chạy trong terminal thì tôi muốn cung cấp cửa sổ GUI.
Pandya

Câu trả lời:


33

Bạn có thể sử dụng điều này cho các tập tin:

zenity --file-selection

và cái này cho các thư mục:

zenity --file-selection --directory

để sử dụng, hãy chạy:

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

Nói chung, nó phù hợp với chủ đề hiện tại (dù sao đối với người quản lý cửa sổ GTK), trên máy của tôi có phiên bản sửa đổi của Zukitwo 3.8, nó trông như thế này:

Một cách sử dụng là như thế này:

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

Mà sẽ dẫn đến you selected /path/to/file.

Bạn cũng có thể sử dụng các tùy chọn để đặt tiêu đề phù hợp và thư mục mà nó bắt đầu - Ví dụ: với trường hợp sử dụng rsync của bạn:

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

Đối với các tệp, bạn cũng có thể chỉ định một loại tệp để chọn - ví dụ:

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

LƯU Ý: Bạn cũng có thể sử dụng YAD , một nhánh của Zenity có nhiều tính năng hơn.

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

Nguồn

Đối với hầu hết các phần bạn có thể sử dụng nó theo cùng một cách - cho trình duyệt tệp:

yad --file-selection

và cho trang trợ giúp:

yad --help-all

Mặc dù tại thời điểm đó (khoảng phiên bản 26?), Nó chưa được cập nhật để phù hợp với giao diện GTK 3.14+ mới (zenity có) - nó có nhiều tính năng hơn, nhưng kiểm tra tính tương thích (dựa trên tài liệu nên hoạt động trên GTK +> = 2.16. 0


2
Yad là một nhánh của Zenity được tăng cường đáng kể và phần lớn đã thay thế nó kể từ khi dự án Zenity không hoạt động. Tôi thấy rằng Zenity hiện đã được phát triển trở lại tại Gnome.org (chỉ Gnome3?) Nhưng tôi không thấy cách nào tải xuống.
DocSalvager

@DocSalvage - trang đó khá cổ xưa - nó cho biết bản phát hành tiếp theo '3.2' - Tôi có phiên bản 3.8 trên hệ thống Fedora 19 khá cũ (với Gnome 3.8 - khá nhiều bit gnome được cập nhật cho mỗi phiên bản shell Gnome ( vì vậy nó có thể đã được cập nhật cho 3.10 + 3.12)). Nó cũng xử lý các báo cáo lỗi từ năm 2005-2009. Bạn có thể nhận được phiên bản mới nhất ổn định (3,8 lần nữa) từ Repos Ubuntu - packages.ubuntu.com/trusty/zenity . Bạn cũng có thể tìm thấy các phiên bản đã biên dịch của Yad tại đây .
Wilf

Yad trông khá tốt - nó có nhiều lựa chọn hơn so với sự thoải mái :)
Wilf

1
@Wilf Vâng, yad là Zenity trên steroid. Một khi bạn nắm bắt được nó, nó sẽ rung chuyển vì nó rất linh hoạt. Tôi là một người chuyển đổi. Tôi đã trả lời (không thể cưỡng lại điều đó, xin lỗi) một câu trả lời cho câu hỏi OP bên dưới, btw.
Scooby-2

@ Scooby-2 hướng dẫn cài đặt bổ sung thú vị để trả lời (để người dùng trong tương lai không phải thực hiện nhận xét)
Wilf

19

Chỉ để ghi lại, bạn có thể sử dụng dialogcho giải pháp Giao diện người dùng dựa trên văn bản (TUI).

Cú pháp:

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

Thí dụ:

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

Đầu ra sẽ giống như thế này:

Thí dụ

Như được chỉ ra bởi @Wilf, bạn có thể sử dụng các biến $LINES$COLUMNSbiến để làm cho nó lấp đầy thiết bị đầu cuối:

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

1
Mặc dù đây là giải pháp thay thế phù hợp nhưng nó không cung cấp cửa sổ GUI như được đề cập trong câu hỏi!
Pandya

2
Tôi biết, nhưng người khác có thể thấy nó hữu ích. Tôi đăng ảnh chụp màn hình để tránh bất kỳ sự nhầm lẫn.
kraxor

7
Và, công bằng mà nói, nó đủ điều kiện là GUI IMHO.
kraxor

3
Dòng thường được sử dụng giữa GUI và TUIs (UI văn bản) là kích thước của "nguyên tử": đó là pixel hay ký tự?
unperson325680

3
Câu trả lời hay - chiều rộng và chiều cao của một số thiết bị đầu cuối được xác định bởi các biến thể như $LINES$COLUMNS- vì vậy bạn chạy $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))để làm cho nó lấp đầy cửa sổ thiết bị đầu cuối / màn hình.
Wilf

5

Tôi biết điều này đã 8 tháng tuổi và câu hỏi của OP đã được trả lời. Tuy nhiên, yad đã được đề cập nhưng không có ví dụ nào được đưa ra. Đây là giải pháp của tôi bằng cách sử dụng 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]}\""

Cách nó hoạt động là như thế này. Chúng tôi đặt yad trong một vòng lặp for, đặt biến $locationthành sourcecho lần đầu tiên và destinationcho lần thứ hai. Đầu ra được đặt trong mảng selection[]mà biến iđược sử dụng làm chỉ mục. Điều này được đặt thành 0 khi bắt đầu và tăng dần với mỗi lần vượt qua. Do đó nguồn được lưu dưới dạng ${selection[1]}và đích ${selection[2]}.

DIR = "/ home" trên dòng đầu tiên đặt mặc định hộp thoại. Các tùy chọn lệnh yad có thể được tìm thấy từ thiết bị đầu cuối bằng cách gõ yad --help.

ảnh chụp màn hình yad


2

Đây là giải pháp ngắn nhất (và tốt nhất) cho câu trả lời: Yadcung cấp tùy chọn chính xác giống như zenity:

yad --file-selection --directory

Điều này sẽ mở một hộp thoại lựa chọn thư mục. Nếu không có đối số bổ sung, --directorynó sẽ là một hộp thoại chọn tệp thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.