将文件路径传递给使用 cygstart 打开的命令时转义空格

Escape spaces when passing a file path to a command opened with cygstart

问题

当运行执行以下命令时:

cygstart bash "/home/FirstName LastName/bin/script.sh"

传递给 bash 的文件路径在 space 处被截断,因此出现以下错误:

/usr/bin/bash: /home/FirstName: No such file or directory

我尝试过的:

1.

cygstart bash "/home/FirstName LastName/bin/script.sh"

2.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash "$FILE_PATH"

3.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash "${FILE_PATH}"

4.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash ${FILE_PATH}

5.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
MY_COMM=$(cygstart bash "$FILE_PATH")
eval $MY_COMM

以及其他六个我现在想不起来的变体,包括以上所有带有反斜杠以转义 space 的变体。错误总是一样的。

我错过了什么,或者有没有办法解决这个问题?

更新:我在这种情况下使用 cygstart 的原因是为了利用它的 --action=runas 选项。我正在调用的脚本重命名了一个文件,但它必须 运行 具有管理员权限才能这样做。我的想法是我可以调用脚本然后输入适当的凭据。

为了测试,我在 ~/Test Dir/test.sh 中创建了一个脚本。这是对我有用的:

cygstart bash \"/home/cxw/Test\ Dir/test.sh\"

开头和结尾的 \" 是独立的双引号,它将把它们之间的内容包裹起来,将它们作为一个参数放在一起。

问题是参数被放入 Windows ShellExecute function,这最终会在空白处拆分 args。要查看 运行 的确切命令,请使用 cygstart -v.

上面的结果是这样的 ShellExecute 调用:

ShellExecute(NULL, "(null)", "bash", ""/home/cxw/Test Dir/test.sh"", "(null)", 1)

注意成对的双引号:外引号由 cygstart -v 打印,内引号是 \" 以将脚本名称放在一起。

我列出了 /home/cxw 而不是 ~,因为 ~ 对我不起作用。如果需要,可以使用 cygpath -a 获取绝对路径。