Ruby有三种方法为我们提供被调用脚本的名称:
#!/usr/bin/env ruby
puts "$0 : #{$0}"
puts "__FILE__ : #{__FILE__}"
puts "$PROGRAM_NAME : #{$PROGRAM_NAME}"
将该代码保存为"test.rb"并以多种方式调用,表明脚本在操作系统传递给它时收到了名称.脚本只知道操作系统告诉它什么:
$ ./test.rb
$0 : ./test.rb
__FILE__ : ./test.rb
$PROGRAM_NAME : ./test.rb
$ ~/Desktop/test.rb
$0 : /Users/ttm/Desktop/test.rb
__FILE__ : /Users/ttm/Desktop/test.rb
$PROGRAM_NAME : /Users/ttm/Desktop/test.rb
$ /Users/ttm/Desktop/test.rb
$0 : /Users/ttm/Desktop/test.rb
__FILE__ : /Users/ttm/Desktop/test.rb
$PROGRAM_NAME : /Users/ttm/Desktop/test.rb
在第二个示例中,使用$HOME的~
快捷方式调用它,显示操作系统将其替换为扩展路径,与第三个示例中的匹配.在所有情况下,这都是操作系统传递的信息.
使用硬链接和软链接链接到文件显示了一致的行为.我为test1创建了一个硬链接.rb和test2的软链接.rb:
$ ./test1.rb
$0 : ./test1.rb
__FILE__ : ./test1.rb
$PROGRAM_NAME : ./test1.rb
$ ./test2.rb
$0 : ./test2.rb
__FILE__ : ./test2.rb
$PROGRAM_NAME : ./test2.rb
在脚本名上使用任何变体启动ruby test.rb
都会返回一致的结果.
如果您只想要被调用的文件名,那么可以将File的basename
方法与其中一个变量一起使用,或者在分隔符上拆分并获取最后一个元素.
$0
和__FILE__
有一些细微的区别,但对于单个脚本,它们是等效的.
puts File.basename($0)
使用File.basename
File.extname
和File.dirname
方法套件有一些好处.basename
接受一个可选参数,即strip的扩展名,因此如果只需要basename而不需要扩展名
File.basename($0, File.extname($0))
在不重新设计车轮、不必处理可变长度或缺失延伸件或不正确截断延伸链".rb.txt
"的可能性的情况下进行操作,例如:
ruby-1.9.2-p136 :004 > filename = '/path/to/file/name.ext'
=> "/path/to/file/name.ext"
ruby-1.9.2-p136 :005 > File.basename(filename, File.extname(filename))
=> "name"
ruby-1.9.2-p136 :006 > filename = '/path/to/file/name.ext' << '.txt'
=> "/path/to/file/name.ext.txt"
ruby-1.9.2-p136 :007 > File.basename(filename, File.extname(filename))
=> "name.ext"