运行 "./" bash/batch 带有 cygwin 的文件

Run "./" bash/batch file with cygwin

嗯,思路是这样的,

我有 linux 的 bash 文件,显然我通过制作 ./my_run 运行 它。 问题是我在 windows 所以我下载并安装了 cygwin。 我将 cygwin bin 添加到环境变量并检查至少 "ls" 是否有效,所以我猜我做得很好。 当我尝试使用它显示的 cmd 运行 它时:

'.' is not recognized as an internal or external command,
operable program or batch file.

好像没有正确安装 cygwin 变量(正如我所说,我尝试了 ls 并且可以正常工作)。 然后我直接用 cygwin 尝试了它,在执行 ./my_run 时我让它工作正常。

那么我可以使用 ls 之类的命令,但是在执行 ./ 时它在 cmd 上不起作用,这是怎么回事?我该如何解决这个问题?

如果你打开 Cygwin 和运行那里的命令你应该没问题。

好吧,cygwin 只是一个共享库和许多使用它的东西(程序)(阅读 Cygwin 文档)。 cygwin.dll 更改内部路径解析 / 字符以允许您说 ./my_script 并在执行实际的 windows 调用之前将其转换为 .\my_script,它还添加了适当的扩展到可执行文件以允许它执行 windows 二进制文件。只要你使用它,这种魔法就会持续存在。 cmd.exe 是 Microsoft Windows 命令 shell 完全不知道 Cygwin 的共享库,因此它不使用它,因此它不会调用它进行路径转换,即使你填充了 zetabytes 的环境。当您在 Cygwin 终端中 运行 时,您正在 运行ning bash shell,这是一个 Cygwin 可执行文件,链接到 cygwin.dll。它设法将 Cygwin 库用于所有 unix 系统调用仿真,因此当您传递它时,例如到 exec("./my_script", ...);,它在内部将其转换为尝试 ./my_script,然后是 .\my_script./my_script.exe,... .com 和 [=22= 也是如此] 扩展。

这个事实常常让一些人说 Cygwin 不是一个好的、高效的环境。但目的不是为了高效(而且它是,因为它缓存条目并使事情最好地变得高效)而是为了兼容。

在您的示例中,ls 是一个 Cygwin 可执行文件,它模仿来自 unix 系统的 /bin/ls 可执行文件。它使用 Cygwin 库,因此所有路径解析都将正确进行(好吧,在某些限制下,正如您将在一些测试后看到的那样)并且一切都会正常工作。但是您不能假装您的所有 Windows 应用程序突然改变自己并开始工作,就好像它们在不同的环境中一样。这需要您必须自己尝试一些尝试和错误的方法。并阅读 Cygwin 文档,它非常好,涵盖了我在这里所说的所有内容。