【问题标题】:Ruby 1.9.3 unexpected File behavior under msysRuby 1.9.3 msys 下的意外文件行为
【发布时间】:2013-05-15 17:59:36
【问题描述】:

我正在尝试在 Windows 7 上使用带有 msys 的 Ruby 1.9.3 将文件复制到 "/usr/bin"。Msys 很乐意从它的类似 bash 的 shell 中执行此操作 - $cp testscript.rb /usr/bin 可以解决问题。

但在 Ruby 内部却完全不同,FileUtils.cp/usr/binC:/usr/bin 都失败了。问题似乎在于 msys 和 Ruby 如何处理路径,而他们在这一点上并不一致。

$ cd /usr/bin
$ pwd
/usr/bin
$ irb
irb(main):001:0> Dir.pwd
=> "C:/msysgit/bin"

果然,FileUtils.cp("testscript.rb", "C:/msysgit/bin") 有效。 这是我的问题:我如何在这些之间进行翻译?我知道我想将我的文件移动到/usr/bin,我可以推断到C:/usr/bin,但我不知道如何找出它真的是C:/msysgit/bin,我不能只是硬编码它,因为它需要不仅仅在我的设置上工作。

我需要一种方法来 (1) 说服 Dir 和 FileUtils 和 File 以与 msys shell 相同的方式理解路径或 (2) 知道如何在它们之间进行转换。

有没有其他人看到过这个问题?有什么建议吗?

【问题讨论】:

  • 我假设 msys 有一个根/主目录,不(可能是 MSYSDIR)?结合mingw.org/wiki/Posix_path_conversion 应该足以让它们正确转换。
  • File.expand_path("/usr/bin") 返回什么?
  • 我试过了——不幸的是"c:/usr/bin"
  • MSYSDIR 或等价物正是我所需要的!但它不是 MSYSDIR :(
  • 好的,原来有ENV['BIN'],其中包含"C:\msysgit\bin",我可以使用它。感谢您的帮助!

标签: ruby msys


【解决方案1】:

在我看来,您最好的选择是使用 cygpath

不过,正如您所料,这是一个 Cygwin 程序,需要 Cygwin dll,可以在这里看到

$ ldd /bin/cygpath | grep /usr cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)

如果这对您有用,您可以从以下网址之一下载 cygpath Cygwin mirrors

例子

box-soft.com/release/cygwin/cygwin-1.7.18-1.tar.bz2

之后就很容易转换了,如你所见

$ cygpath C:/msysgit/bin /usr/bin $ cygpath -m /usr/bin C:/msysgit/bin

【讨论】:

    【解决方案2】:

    在 Windows 下的 msys 下(但不是在 linux 下)有 ENV['BIN'] 包含 bin 目录的路径,在本例中为 "C:\msysgit\bin"。这实际上是 msys 中 /bin 和 /usr/bin 指向的同一目录,所以这正是我所需要的。

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多