简单脚本可以使用 GUI 文件管理器来选择文件吗?

简单脚本可以使用 GUI 文件管理器来选择文件吗?

我有一个非常简单的脚本,当前对位于同一文件夹中的文件执行命令:command ./file_in_folder option output。如果脚本询问用户他们想要哪个文件会更好。

一个简单的脚本可以要求操作系统的默认 GUI 文件管理器打开并将选定的文件传回脚本吗?

假代码:

  • 用户双击可执行脚本
  • 弹出 GUI 文件管理器
  • 用户选择<FILE>
  • 脚本执行command <FILE> option output

如果没有,建议以什么方式传递<FILE>给将要执行的脚本command <FILE> option output

答案1

Zenity 可用于制作 GUI 文件选择器,使用选项--file-selection。对于单个文件,这已经足够了:

#! /bin/bash

file="$(zenity --title "Pick a file" --file-selection)"
do something with "$file"

在此处输入图片描述

处理多个文件时会比较棘手。文件名中不允许出现的字符只有两个:ASCII 空值/./当然会出现在路径中。因此,您可以安全地选择用来分隔两个文件名的唯一字符是NUL。您不能使用 NUL,因为该字符必须作为命令行参数传递。

您有两个选择:

  • 使用重复选择对话框一次选择一个文件。
  • 验证返回的每个路径zenity都是绝对路径,并且文件存在。

就像是:

#! /bin/bash

OLDIFS="$IFS"
IFS='-'
FILES=($(zenity --file-selection --multiple --separator='-' --title "Pick a file"))
IFS="$OLDIFS"

for file in "${FILES[@]}"
do
    if [[ $file == /* && -f $file ]]
    then
        echo $file
    fi
done

当然,即使这样也无法避免使用这样的文件名/foo/bar-/etc/passwd。因此,如果您的脚本以比用户更高的权限运行,请务必小心。

相关内容