从Bash脚本向程序传递基于Windows斜杠(/)的参数

40

我正在尝试从我的Bash脚本中运行以下内容。(通过msysgit安装的bash)

taskkill /IM ssh-agent.exe

我从屏幕上使用taskkill得到的输出结果是:

ERROR: Invalid argument/option - 'C:/Program Files/Git/IM'.
Type "TASKKILL /?" for usage.

可执行文件正在运行,但是无论我尝试什么转义方法,/IM 都会被展开...


我已经尝试使用 \/IM,但这样会发送带有反斜杠的 \/IM。我试过几种不同的方法,例如运行 eval、cmd /c start 等等,但它们似乎都存在问题。我还尝试了 set -o noglob,但也没有起作用。类似的尝试,如 $'\057/'IM 也都失败了...


也许尝试使用 .\SomeExecutable.exe "/foo" - l'L'l
@l'L'l SomeExecutable 运行良好,问题在于传入 SomeExecutable 的参数是 /some/path/to/foo 而不仅仅是 /foo - Tracker1
哦,我明白了...像你做的那样转义似乎是合乎逻辑的;我唯一的建议可能是尝试在引号中使用它。 - l'L'l
2个回答

44

因为我的评论实际上提供了答案,所以我会发布它。

如果想要转义正斜杠到另一个正斜杠,可以像这样使用//。当我执行以下命令并转义了/r参数时,它对我有效:start C:/folder/beep 2000 250 100 //r 3

来源:http://oldwiki.mingw.org/index.php/switches%20with%20forward%20slashes

Minimalist GNU for Windows

在MSYS下传递带有正斜杠的开关

在MSYS中,以“/ c”开头的命令行参数将被解释为C:驱动器,因此要传递任何以正斜杠开头的参数,您需要使用两个正斜杠。例如,在MSYS中使用此命令:

cmd /c echo foo

使用:

cmd //c echo foo

如果您需要在shell脚本中具有路径的Windows风格,则可以执行以下操作

x = $(cd /unix/path && cmd //c cd)

x变量现在包含与/ unix / path相应的Windows等效路径


将Unix路径转换为变量中的Windows路径的技巧非常有用。但是,您应该知道,如果“/unix/path”是符号链接(例如,通过“mklink /j c:\unix\path d:\unix\path”创建),则您的变量将显示链接位置“d:\unix\path”。 - sveinbr
2
@sveinbr:谢天谢地,msys2又有了cygpath,是吧?我记得曾经遇到过某个版本的msys,它的维护者把cygpath给删掉了,显然只是因为“你不应该需要这样一个东西,因为Msys会自动翻译路径名,即使在环境中也是如此。”。 - SamB
然而,如果我们正在MinGW中运行一个巨大的bash脚本,我们无法修改该脚本使其与mingw语法兼容... - recolic

5

经过数小时的搜索,像“禁用bash文件扩展”等各种搜索后,我通过专门搜索"bash" "windows" taskkill找到了我要运行的可执行文件。我发现这个答案,最终解决了我的问题。

cmd " /c taskkill /F /IM ssh-agent.exe"

3
你可以用另一个正斜杠 // 转义正斜杠,这样做对我有效。来源:http://oldwiki.mingw.org/index.php/switches%20with%20forward%20slashes - M. Mimpen
1
@M.Mimpen非常感谢,这对我也有用...我尝试过\/,也不知道还有多少其他排列组合可以尝试,以便让bash不使用路径完成。我试图使我的Windows start-ssh-agent与基于cmd的那个匹配... - Tracker1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接