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

nih*_*lon 4 cygwin

问题

运行以下命令时:

cygstart bash "/home/FirstName LastName/bin/script.sh"
Run Code Online (Sandbox Code Playgroud)

传递给的文件路径bash在空间处被切断,所以我收到以下错误:

/usr/bin/bash: /home/FirstName: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我试过的:

1.

cygstart bash "/home/FirstName LastName/bin/script.sh"
Run Code Online (Sandbox Code Playgroud)

2.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash "$FILE_PATH"
Run Code Online (Sandbox Code Playgroud)

3.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash "${FILE_PATH}"
Run Code Online (Sandbox Code Playgroud)

4.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
cygstart bash ${FILE_PATH}
Run Code Online (Sandbox Code Playgroud)

5.

FILE_PATH="/home/FirstName LastName/bin/script.sh"
MY_COMM=$(cygstart bash "$FILE_PATH")
eval $MY_COMM
Run Code Online (Sandbox Code Playgroud)

连同其他六个我现在想不起来的变体,包括以上所有带有反斜杠的变体以逃避空间。错误总是一样的。

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

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

cxw*_*cxw 5

为了测试,我在~/Test Dir/test.sh. 以下是对我有用的内容:

cygstart bash \"/home/cxw/Test\ Dir/test.sh\"
Run Code Online (Sandbox Code Playgroud)

\"在开始和结束是独立的双引号,这将包装他们之间有什么共同保持它作为一个参数。

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

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

ShellExecute(NULL, "(null)", "bash", ""/home/cxw/Test Dir/test.sh"", "(null)", 1)
Run Code Online (Sandbox Code Playgroud)

请注意成对的双引号:外部引号由 打印cygstart -v,内部引号\"用于将脚本名称保持在一起。

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