Ruby中system()的奇怪行为

Ruby中system()的奇怪行为,ruby,windows,shell,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 我想这是因

我已经通过示例在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的了解也不足以了解其中的区别。有人能解释一下这一点吗?

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


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

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

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

我希望这是清楚的。如果你想用ruby编写代码,建议你安装Linux或Mac。

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


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

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

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

我希望这是清楚的。如果您想用ruby编写代码,请安装Linux或Mac。

您能告诉我们您使用的是哪个版本的ruby吗?system()的行为在Ruby 1.9.x中发生了变化,与1.8.x版本相比,它的行为更加正确。您能告诉我们您使用的是哪个版本的Ruby吗?system()的行为在Ruby 1.9.x中发生了更改,并且比1.8.x版本的行为更加正确。感谢您的解释。这就解释了当我想通过
system
或bat文件启动ruby脚本时,为什么我必须在ruby脚本前面添加
rube.exe
。“如果在windows上打开命令行,您可以在不指定扩展名的情况下运行程序,因为windows会自动尝试不同的扩展名。”该文件实际上被调用“mpg123.exe”。谢谢您的回答,但我不清楚当工作目录不在%PATH%中而只在“mpg123”中时为什么需要调用“mpg123.exe”“当它是。另外,Linux和Mac是很好的建议,但我在大学,没有自己的电脑。。。PyCmd为我创造了奇迹,如果我真的需要它,我可以安装MinGW或其他东西。Windows对我来说很好。我现在明白你的问题了。我只是尝试了你提到的,我也不明白为什么ruby在文件不在路径上时需要扩展名。顺便说一句,我在Java上进行了测试,得到了相同的结果(file without extension=>error),因此这可能是windows解析程序位置/名称的方式。现在有点晚了,否则我会尝试在C:)上做同样的事情。谢谢你的解释。这就解释了当我想通过
system
或bat文件启动ruby脚本时,为什么我必须在ruby脚本前面添加
rube.exe
。“如果在windows上打开命令行,您可以在不指定扩展名的情况下运行程序,因为windows会自动尝试不同的扩展名。”该文件实际上被调用“mpg123.exe”。谢谢您的回答,但我不清楚当工作目录不在%PATH%中而只在“mpg123”中时为什么需要调用“mpg123.exe”“当它是。另外,Linux和Mac是很好的建议,但我在大学,没有自己的电脑。。。PyCmd为我创造了奇迹,如果我真的需要它,我可以安装MinGW或其他东西。Windows对我来说很好。我现在明白你的问题了。我只是尝试了你提到的,我也不明白为什么ruby在文件不在路径上时需要扩展名。顺便说一句,我在Java上进行了测试,得到了相同的结果(file without extension=>error),因此这可能是windows解析程序位置/名称的方式。这里有点晚了,否则我会尝试在C:)上做同样的事情。