一个Ruby脚本能否确定它所在的目录?

91
4个回答

128

对于较新版本的 Ruby,请尝试:

  • __dir__

对于旧版本的 Ruby(< 2.0),可以使用以下方法找到正在运行的脚本:

  • File.dirname(__FILE__) - 相对路径;或者
  • File.expand_path(File.dirname(__FILE__)) - 绝对路径。

注意:使用__dir__将在调用Dir.chdir后返回脚本路径,而使用旧语法可能无法返回脚本路径。


"File.expand_path(File.dirname(FILE))" 在查找绝对路径方面非常有用。 - Kapidis

88

除了__dir__是正确的答案外,感谢您还提供了大小写差异的链接,这也是我在找到它后的第一个问题 :) - SidOfc

11

使用 __dir__

File.dirname(__FILE__) 不是获取脚本所在目录的正确方式。

开始时,工作目录和脚本文件所在目录相同,但是它们可能会改变。

例如:

Dir.chdir('..') do
    puts __dir__
    puts File.expand_path(File.dirname(__FILE__))
end

脚本文件存储在/Desktop/tmp中,运行它将会产生输出。

/home/mateusz/Desktop/tmp
/home/mateusz/Desktop

-10

在Linux下,ENV["PWD"]似乎是我最简单的方式。我不知道是否有跨操作系统的方法。


谢谢!这对我的Linux特定的通识知识很有帮助。 - java.is.for.desktop
那是主目录,不是当前工作目录或脚本所在的目录。 - Matthew Flaschen
该死,睡眠不足会导致这种情况。我当然是指ENV["PWD"]。但是ba的答案更好。 - Shadowfirebird
15
那不就是进程的工作目录吗?我以为楼主想要包含脚本的目录。 - D.Shawley
不,该进程可以从其他地方执行外部脚本。 - java.is.for.desktop
这个环境变量取决于shell。它远非“可靠”。例如,从systemd分叉的服务根本不包含此变量。 - iBug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接