我有一个非常简单的脚本,当前对位于同一文件夹中的文件执行命令: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
。因此,如果您的脚本以比用户更高的权限运行,请务必小心。