Ruby中system()的奇怪行为

时间:2011-09-03 07:34:23

标签: ruby windows shell

我已经在Ruby中通过示例设置shuffle_play.rb来在Windows上工作,使用mpg123而不是ogg123。关键部分是一个叫做play_file的方法,我最初写的就是这个

def play_file(file)
  system("mpg123 \"#{file}\"")
end

我的mpg123与我的脚本在同一个目录中...它没有用。但这确实有效:

def play_file(file)
  system("mpg123.exe \"#{file}\"")
end

我认为这是因为我在%PATH%中没有工作目录(实际上当我添加它时问题就消失了)但是即便如此,我还不太了解Windows以了解其中的差异。有人可以解释一下这个理由吗?

1 个答案:

答案 0 :(得分:3)

可能这些示例假设您使用的是* nix变体,例如Linux或Mac。在那些操作系统中,程序被称为mpg123,因为那些操作系统不关心扩展,只检查文件是否具有可执行属性

在Windows上,事情非常不同。 Windows决定某些程序是否是程序,具体取决于扩展名(.exe,.com,.bat,.cmd等)。因此,Windows中的程序必须被称为mpg123.exe。如果在Windows上打开命令行,则可以在不指定扩展名的情况下运行程序,因为Windows会自动尝试不同的扩展名。尝试不同扩展的这种行为在命令行中发生 ONLY ,而不是在您尝试从另一个程序调用程序时。

有一个名为PATHEXT的环境变量列出了哪些顺序窗口尝试不同的扩展。在我的计算机上,列表是:

C:\Windows\System32>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW

我希望很清楚。如果你想在ruby中编码,安装Linux或获得Mac,那么建议你。