在Ruby 1.9.3中使用%x调用pwd是否有任何已知问题?

时间:2013-06-29 19:28:59

标签: ruby rake puppet pwd

最近在工作中,我们遇到了Puppet中的错误。我决定在空闲时间尝试修复bug。这个过程的第一步是让它使用git克隆工作。我按照说明进行操作,然后尝试使用rake,我开始收到此错误:

PS C:\Puppet-Code\Puppet> rake
rake/gempackagetask is deprecated.  Use rubygems/package_task instead
The system cannot find the path specified.
rake aborted!
No such file or directory - pwd

(See full trace by running task with --trace)

我用--trace运行它得到了这个:

PS C:\Puppet-Code\Puppet> rake --trace
rake/gempackagetask is deprecated.  Use rubygems/package_task instead
The system cannot find the path specified.
rake aborted!
No such file or directory - pwd
ext/packaging/tasks/00_utils.rake:198:in ``'
ext/packaging/tasks/00_utils.rake:198:in `get_pwd_version'
ext/packaging/tasks/00_utils.rake:171:in `get_dash_version'
ext/packaging/tasks/10_setupvars.rake:65:in `<top (required)>'
C:/Puppet-Code/Puppet/Rakefile:25:in `load'
C:/Puppet-Code/Puppet/Rakefile:25:in `block in <top (required)>'
C:/Puppet-Code/Puppet/Rakefile:25:in `each'
C:/Puppet-Code/Puppet/Rakefile:25:in `<top (required)>'
C:/Ruby193/lib/ruby/1.9.1/rake/rake_module.rb:25:in `load'
C:/Ruby193/lib/ruby/1.9.1/rake/rake_module.rb:25:in `load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:501:in `raw_load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:82:in `block in load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:81:in `load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:65:in `block in run'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:63:in `run'
C:/Ruby193/bin/rake:32:in `<main>'

在查看文件后,我发现这就是问题所在:

%x{pwd}.strip.split('.')[-1]

我正在使用Powershell运行rake文件,当我直接在Powershell中运行pwd时,它可以运行。但是,如果我使用%x {pwd}在irb中运行它,我只会收到一条错误消息,指出没有这样的文件或目录'pwd'。我的理解是%x只是将该命令传递给shell(我认为它是Powershell,因为那是我运行它的地方)。

任何人都可以解释为什么%x {pwd}无法正常工作以及我可以做些什么来修复它?

编辑:我在Windows上使用Powershell。

感谢。

3 个答案:

答案 0 :(得分:3)

在Ruby中,默认情况下反引号,%xsystemexec将无法在PowerShell下运行。

在Windows上,即使您在另一个shell中启动进程,subshel​​l,irb等,所有系统命令也将在cmd.exe下运行。没关系 - Ruby总是会生成cmd.exe来运行任何系统命令。

来自Kernel.exec的文档:

  

标准shell在类Unix系统上总是表示“/ bin / sh”,与ENV [“RUBYSHELL”](或Windows NT系列上的ENV [“COMSPEC”])相同,类似。

您可以尝试更改RUBYSHELLCOMSPEC以引用PowerShell,但是您可能很难让它工作。

相反,我会尝试其他解决方案,例如找到在pwd下运行的等效cmd.exe命令并使用它。

或者为什么不使用Dir.pwd

答案 1 :(得分:2)

使用OS-Agnostic Methods

不要依赖shell来为您提供当前的工作目录,而是使用Dir#pwd。例如:

directory = Dir.pwd

或者,如果您真的想要使用Windows shell,可以查看this older question.但是,与操作系统无关的方法通常更为健全。

实施例

给定 C:\ tmp \ foo.bar 的当前工作目录,Dir模块应该产生以下结果:

Dir.pwd.strip.split('.')[-1]
# => "bar"

假设“bar”确实是你正在寻找的字符串,一切都应该是好的。如果您正在做一些更复杂的事情,您可能需要更新您的问题。

答案 2 :(得分:0)

将评论重新发布并扩展为可能的答案。如果您使用的是Windows,则pwd无法作为评论。您需要使用cdecho %cd%

Windows equivalent to UNIX pwd

在上述帖子中不要错过这个答案:

https://stackoverflow.com/a/4634089/417194

  

以管理员身份打开记事本并写下:

@echo %cd%
     

将其保存在c:\ windows \ system32 \中,名称为“pwd.cmd”(注意不要保存pwd.cmd.txt)

     

然后你有了pwd命令。

还有内置的ruby功能:

http://ruby-doc.org/core-2.0/Dir.html#method-c-pwd