处理文件名中的空格

处理文件名中的空格

我编写了以下 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"  ...

相关内容