2

最近在工作中,我们遇到了Puppet的一个 bug 。我决定在空闲时间尝试修复这个错误。这个过程的第一步是使用 git clone 让它工作。我仔细阅读了说明,然后尝试使用 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。

谢谢。

4

3 回答 3

3

默认情况下,在 Ruby 中,反引号、、、%xsystem不会exec在 PowerShell 下运行。

在 Windows 上,所有系统命令都将在 下运行cmd.exe,即使您在另一个 shell 中启动进程、子shell、irb 等。没关系 - Ruby 将始终生成cmd.exe运行任何系统命令。

从以下文档Kernel.exec

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

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

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

或者为什么不直接使用Dir.pwd.

于 2013-06-29T20:38:43.883 回答
2

使用与操作系统无关的方法

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

directory = Dir.pwd

或者,如果您真的想为此使用 Windows shell,您可以查看这个较旧的问题。但是,与操作系统无关的方法通常更合理。

例子

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

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

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

于 2013-06-29T21:05:08.257 回答
0

重新发布和扩展评论作为可能的答案。如果您在 Windows 上,pwd则不能作为评论使用。您需要使用cdor echo %cd%

Windows 等同于 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

于 2013-06-29T20:15:45.827 回答