如何将路径从 shell 读取命令传递到 wslpath
How to pass a path from a shell read command to wslpath
我正在尝试编写一个脚本,当 运行 在WSL Windows.
# Drag and drop the directory into the Bash window
IFS="" read -r input
echo;
# If system is Windows Subsystem for Linux convert Windows paths to Unix paths
if [[ $(uname -r) =~ Microsoft$ ]]; then
input="$( wslpath "$input" )"
fi
# Use eval to parse spaces in the path as an array
eval "input=( $input )"
# List files and directories
ls -l "${input}"; echo;
如果目录名称中有 space,则无法找到要列出的目录。
如果我将 eval "input=( $input )"
行移动到 Windows 子系统上方以获取 Linux 条件,如果目录名称中有 space 但没有找到目录' t 如果没有 space.
如果我将行 input="$( wslpath "$input" )"
替换为以下 Bash 替换表达式,它可以使用或不使用 spaces 但驱动器号必须硬编码 input=${input/F:\/\/mnt\/f\/}
我已经阅读了多个关于 Bash 中引号求值顺序的帖子,将参数作为数组传递给函数,然后扩展这些数组,但我真的很难解决这个问题我就是无法让它工作。
由于只有一条路径,因此不需要数组。只要您引用变量,路径内的空格就会得到正确处理。
实际上,将路径拆分为单词数组会导致信息丢失。您不会知道数组 (a b)
最初是 a b
(一个 space)还是 a b
(两个 space)。此外,您不需要 eval
将变量拆分为单词。 array=($var)
是要走的路。
这里的问题是 Windows 通过用双引号将路径括起来来粘贴带有 space 的路径。也就是说,如果你拖放 C:\a
,你会得到字符串 C:\a
,但如果你拖放 C:\a b
,你会得到 "C:\a b"
。 bash 不解释这些引号,因为它们只是输入而不是脚本的一部分。 wslpath
也不解释这些引用。相反 wslpath '"C:\a b"'
查找驻留在驱动器 "C:
上的字面上名为 a b"
的文件。我们必须手动删除 Windows' drag'n'drop 插入的引号。
IFS= read -r input; echo
if [[ "$(uname -r)" =~ Microsoft$ ]]; then
# is path quoted and contains a space?
if [[ "$input" =~ ^\"(.*\ .*)\"$ ]]; then
# remove quotes
input="${BASH_REMATCH[1]}"
fi
input="$( wslpath "$input" )"
fi
ls -l "${input}"; echo
我正在尝试编写一个脚本,当 运行 在WSL Windows.
# Drag and drop the directory into the Bash window
IFS="" read -r input
echo;
# If system is Windows Subsystem for Linux convert Windows paths to Unix paths
if [[ $(uname -r) =~ Microsoft$ ]]; then
input="$( wslpath "$input" )"
fi
# Use eval to parse spaces in the path as an array
eval "input=( $input )"
# List files and directories
ls -l "${input}"; echo;
如果目录名称中有 space,则无法找到要列出的目录。
如果我将 eval "input=( $input )"
行移动到 Windows 子系统上方以获取 Linux 条件,如果目录名称中有 space 但没有找到目录' t 如果没有 space.
如果我将行 input="$( wslpath "$input" )"
替换为以下 Bash 替换表达式,它可以使用或不使用 spaces 但驱动器号必须硬编码 input=${input/F:\/\/mnt\/f\/}
我已经阅读了多个关于 Bash 中引号求值顺序的帖子,将参数作为数组传递给函数,然后扩展这些数组,但我真的很难解决这个问题我就是无法让它工作。
由于只有一条路径,因此不需要数组。只要您引用变量,路径内的空格就会得到正确处理。
实际上,将路径拆分为单词数组会导致信息丢失。您不会知道数组 (a b)
最初是 a b
(一个 space)还是 a b
(两个 space)。此外,您不需要 eval
将变量拆分为单词。 array=($var)
是要走的路。
这里的问题是 Windows 通过用双引号将路径括起来来粘贴带有 space 的路径。也就是说,如果你拖放 C:\a
,你会得到字符串 C:\a
,但如果你拖放 C:\a b
,你会得到 "C:\a b"
。 bash 不解释这些引号,因为它们只是输入而不是脚本的一部分。 wslpath
也不解释这些引用。相反 wslpath '"C:\a b"'
查找驻留在驱动器 "C:
上的字面上名为 a b"
的文件。我们必须手动删除 Windows' drag'n'drop 插入的引号。
IFS= read -r input; echo
if [[ "$(uname -r)" =~ Microsoft$ ]]; then
# is path quoted and contains a space?
if [[ "$input" =~ ^\"(.*\ .*)\"$ ]]; then
# remove quotes
input="${BASH_REMATCH[1]}"
fi
input="$( wslpath "$input" )"
fi
ls -l "${input}"; echo