将文件路径传递给使用 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
获取绝对路径。
问题
当运行执行以下命令时:
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
获取绝对路径。