如何通过命令行提示用户使用 GUI 对话框选择文件/目录路径?

Pan*_*dya 19 gui command-line prompt

假设我有一个这样的脚本:

(该示例描述了一个 rysnc 用例)

#!/bin/bash
echo -n "Enter Source Directory:"
read srcdir
echo -n "Enter Destination Directory:"
read dstdir
rsync -av --delete "$srcdir" "$dstdir"
Run Code Online (Sandbox Code Playgroud)

这里的想法是提示用户输入 rsync 使用的“源”和“目标”目录。照原样,用户将不得不通过命令行手动输入 /path/to/directory/

相反,我想提示用户通过GUI 界面输入路径。

像这样的东西: 尖叫


我可以使用哪些命令通过GUI 选择窗口提示用户,该窗口将文件路径返回到命令行?

Wil*_*ilf 38

您可以将其用于文件:

zenity --file-selection
Run Code Online (Sandbox Code Playgroud)

这对于文件夹:

zenity --file-selection --directory
Run Code Online (Sandbox Code Playgroud)

要使用,请运行:

zenity --help-general
zenity --help-file-selection
Run Code Online (Sandbox Code Playgroud)

通常它与当前主题匹配(无论如何对于 GTK 窗口管理器),在我的机器上使用 Zukitwo 3.8 的修改版本,它看起来像这样:

一种使用方法是这样的:

echo "you selected $(zenity --file-selection)"
Run Code Online (Sandbox Code Playgroud)

这将导致you selected /path/to/file.

您还可以使用选项来设置适当的标题,以及它开始的目录 - 对于您的 rsync 用例,例如:

zenity --file-selection --directory --title="Choose rsync source directory" --filename=$HOME/Desktop/
Run Code Online (Sandbox Code Playgroud)

对于文件,您还可以指定要选择的文件类型 - 例如:

zenity --file-selection --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file"
Run Code Online (Sandbox Code Playgroud)

注意:您还可以使用YAD,它是 Zenity 的一个分支,具有更多功能。

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
Run Code Online (Sandbox Code Playgroud)

来源

在大多数情况下,您可以以相同的方式使用它 - 对于文件浏览器:

yad --file-selection
Run Code Online (Sandbox Code Playgroud)

和帮助页面:

yad --help-all
Run Code Online (Sandbox Code Playgroud)

尽管当时(大约是 26 版?),它还没有更新以匹配新的 GTK 3.14+ 界面(zenity 有)-它具有更多功能,但请检查兼容性(根据文档,它应该适用于 GTK+ >= 2.16。 0

  • [Yad](http://sourceforge.net/projects/yad-dialog/) 是 Zenity 的一个显着增强的分支,自从 Zenity 项目休眠以来,它已经在很大程度上取代了它。我看到 [Zenity 现在在 Gnome.org 重新开发(仅限 Gnome3?)](https://wiki.gnome.org/action/show/Projects/Zenity) 但我看不到下载它的方法。 (2认同)

kra*_*xor 20

只是为了记录,您可以使用dialog基于文本的用户界面 (TUI) 解决方案。

句法:

dialog --title "text" --fselect /path/to/dir height width
Run Code Online (Sandbox Code Playgroud)

例子:

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

输出将是这样的:

例子

正如@Wilf 所指出的,您可以使用$LINES$COLUMNS变量使其填充终端:

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

  • 而且,公平地说,它有资格作为 GUI 恕我直言。 (8认同)
  • GUI 和 TUI(文本 UI)之间的常用线是“原子”的大小:它是像素还是字符? (3认同)
  • 不错的答案 - 一些终端的宽度和高度由诸如 `$LINES` 和 `$COLUMNS` 之类的变量定义 - 所以你运行 `$(dialog --stdout --title "Please select a file" --fselect $HOME / $(expr $LINES - 15) $(expr $COLUMNS - 10))` 使其填充终端/屏幕窗口。 (3认同)
  • 我知道,但其他人可能会觉得它很有用。我发布了屏幕截图以避免任何混淆。 (2认同)

Sco*_*y-2 6

我知道这已经 8 个月大了,而且 OP 的问题已经得到解答。但是,已经提到了 yad,但没有提供任何示例。这是我使用 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]}\""
Run Code Online (Sandbox Code Playgroud)

它的工作方式是这样的。我们把连日来在for循环中,变量设置$locationsource了第一遍和destination第二。输出放置在selection[]变量i用作索引的数组中。这在开始时设置为 0,并随着每次通过而增加。因此源被保存为 ${selection[1]}和目的地${selection[2]}

第一行的 DIR="/home" 设置对话框默认值。可以通过在终端中键入 来找到 yad 命令选项yad --help

亚德截图