我编写了以下 bash 函数,以便使用默认应用程序从命令行轻松打开文件:
## Open files with their default application
function open {
# If no arguments supplied, open current directory in Files application
if [ $# -eq 0 ]; then
xdg-open . &> /dev/null
else
# Else, open all files in the args with their default application
for file in $@; do
xdg-open "$file" &> /dev/null
done
fi
}
此函数大部分情况下都运行正常,但是它无法处理包含空格的文件名。即使对空格进行了转义或对文件名进行了引号处理,如下所示:
open file\ with\ spaces\ in\ name.txt && open "file with spaces in name.txt"
当您尝试打开这些文件时,该函数仍然不执行任何操作。如果我取出 for 循环并让它只打开传递给该函数的第一个参数,则没有问题;只有当我启用它以支持多个参数时,该函数才不起作用。
有办法解决这个问题吗?我确实有一个 bash 函数可以将文件名中的空格替换为下划线,但我不想为了在open
该文件上使用我的函数而这样做。
答案1
为了使每个位置参数扩展为单独的单词,您需要对$@
循环变量和双引号进行引用"$file"
。来自man bash
:
@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ...