Ruby 命令行选项
Ruby 命令行选项中文讲解
Ruby 提供了一系列命令行选项,允许开发者在运行 Ruby 脚本时控制解释器的行为、调试程序、设置编码等。这些选项通过 ruby
命令后加参数指定,适用于所有支持 Ruby 的平台(Windows、Linux、macOS)。本文基于 Ruby 3.4.x(截至 2025 年 8 月的最新稳定版),详细讲解 Ruby 的常用命令行选项、用法及中文处理相关内容。
1. 基本命令行格式
Ruby 命令行的一般格式为:
ruby [选项] [脚本文件] [参数]
- 选项:以
-
或--
开头的参数,控制 Ruby 解释器行为。 - 脚本文件:要运行的
.rb
文件,若省略则从标准输入读取。 - 参数:传递给脚本的参数,可在脚本中通过
ARGV
访问。
示例:
ruby -v script.rb arg1 arg2
2. 常用命令行选项
以下是 Ruby 的主要命令行选项,按功能分类,并包含中文相关说明:
2.1 基本信息与版本
-v
,--version
:- 显示 Ruby 版本并退出。
- 示例:
bash ruby -v
输出:ruby 3.4.0 (2025-XX-XX) [x86_64-linux]
-h
,--help
:- 显示命令行选项帮助。
- 示例:
bash ruby -h
2.2 运行模式
-e '命令'
:- 直接执行指定的 Ruby 代码(无需脚本文件)。
- 示例:
bash ruby -e 'puts "你好,世界!"'
输出:你好,世界!
- 支持多行:
bash ruby -e 'str = "你好"; puts str.upcase'
-r 库
:- 加载指定 Ruby 库(相当于
require
)。 - 示例:
bash ruby -r pp -e 'pp({name: "中文"})'
输出格式化哈希:{:name=>"中文"}
-I 路径
:- 添加库的加载路径(相当于
$LOAD_PATH
)。 - 示例:
bash ruby -I ./lib script.rb
将./lib
目录添加到加载路径。
2.3 编码相关选项
中文处理中,编码选项尤为重要,特别是在 Windows 或处理中文文件时:
-E外部:内部
,--encoding 外部:内部
:- 设置外部和内部编码,格式为
外部[:内部]
。 - 默认:外部编码为
Encoding.default_external
(通常 UTF-8),内部编码为nil
。 - 示例(读取 GBK 文件,内部使用 UTF-8):
bash ruby -EGBK:UTF-8 script.rb
- 示例(强制 UTF-8):
bash ruby -EUTF-8 script.rb
-U
:- 设置内部编码为 UTF-8。
- 示例:
bash ruby -U -e 'puts "你好".encoding'
输出:UTF-8
-K 编码
(已废弃):- Ruby 1.8 用于设置编码(如
-Ku
表示 UTF-8),在 2.x 及以上被-E
取代。
2.4 调试与检查
-w
:- 启用警告模式,显示潜在问题(如未定义变量)。
- 示例:
bash ruby -w script.rb
若script.rb
中有问题,输出警告。 -d
,--debug
:- 启用调试模式,设置
$DEBUG = true
,适合调试复杂程序。 - 示例:
bash ruby -d script.rb
-c
:- 检查脚本语法是否正确,不执行。
- 示例:
bash ruby -c script.rb
输出:Syntax OK
(若无错误)。 -l
:- 自动为每行输出添加换行符(常用于文本处理)。
- 示例:
bash ruby -l -e 'print "你好"'
输出:你好
(自动换行)。
2.5 性能与优化
--jit
:- 启用 JIT(即时编译),提高性能(Ruby 3.x 引入)。
- 示例:
bash ruby --jit script.rb
-W级别
:- 控制警告级别:
-W0
:无警告。-W1
:中等警告。-W2
:详细警告(等同-w
)。
- 示例:
bash ruby -W0 script.rb
2.6 脚本执行与环境
-n
:- 假设脚本在
while gets(); ... end
循环中,适合逐行处理输入。 - 示例(打印每行并添加前缀):
bash echo "你好\n世界" | ruby -n -e 'puts "行: #{$_}"'
输出:行: 你好 行: 世界
-p
:- 类似
-n
,但自动打印每行(相当于puts $_
)。 - 示例(将输入转换为大写):
bash echo "你好" | ruby -p -e '$_.upcase!'
输出:你好
-a
:- 与
-n
或-p
一起使用,自动将每行按空格分割为数组$F
。 - 示例:
bash echo "你好 世界" | ruby -a -n -e 'puts $F[0]'
输出:你好
-F 模式
:- 指定字段分隔符(与
-a
配合)。 - 示例:
bash echo "你好,世界" | ruby -F',' -a -n -e 'puts $F[0]'
输出:你好
3. 中文相关注意事项
中文处理常涉及编码问题,命令行选项可帮助解决:
- 中文乱码:
- Windows:CMD 默认使用 GBK,可能导致乱码。设置 UTF-8:
bash chcp 65001 ruby -EUTF-8 script.rb
- 脚本中显式设置输出编码:
ruby # encoding: UTF-8 $stdout.set_encoding("UTF-8") puts "你好,世界!"
- 使用 PowerShell 或 Windows Terminal,天然支持 UTF-8。
- 文件编码:
- 读取中文文件时指定编码:
bash ruby -EUTF-8 -e 'puts File.read("chinese.txt", encoding: "UTF-8")'
- 处理 GBK 文件:
bash ruby -EGBK:UTF-8 script.rb
- 命令行参数中的中文:
- 传递中文参数:
bash ruby script.rb 你好 世界
脚本示例:ruby # encoding: UTF-8 ARGV.each { |arg| puts "参数: #{arg}" }
- 确保终端支持 UTF-8,否则中文参数可能乱码。
4. 示例:结合命令行选项处理中文
- 逐行处理中文输入:
echo "你好\n世界" | ruby -n -EUTF-8 -e 'puts "处理: #{$_}"'
输出:
处理: 你好
处理: 世界
- 检查中文脚本语法:
# script.rb
# encoding: UTF-8
puts "你好,世界!"
检查:
ruby -c -EUTF-8 script.rb
输出:Syntax OK
- 调试中文程序:
# debug.rb
# encoding: UTF-8
str = "你好"
puts str.reverse
运行:
ruby -d -EUTF-8 debug.rb
- 快速执行中文输出:
ruby -EUTF-8 -e 'puts "中文测试".reverse'
输出:试测文中
5. 进阶用法
- 结合 Rails:
- 运行 Rails 服务器并指定编码:
bash rails server -EUTF-8
- 检查 Rails 脚本语法:
bash ruby -c -EUTF-8 app/controllers/application_controller.rb
- 批量处理文件:
- 处理目录中所有
.txt
文件:bash ruby -EUTF-8 -e 'Dir["*.txt"].each { |f| puts File.read(f, encoding: "UTF-8") }'
- 调试复杂程序:
- 使用
pry
结合-r
:bash ruby -r pry -EUTF-8 script.rb
6. 常见问题与解决
- 中文乱码:
- 原因:终端、文件或 Ruby 编码不一致。
- 解决:
- 确保脚本声明
# encoding: UTF-8
。 - 使用
-EUTF-8
或chcp 65001
(Windows)。 - 检查文件保存编码(推荐 UTF-8 无 BOM)。
- 确保脚本声明
- 选项冲突:
- 某些选项(如
-n
和-e
)可能不兼容,检查帮助:bash ruby -h
- 性能问题:
- 启用 JIT:
bash ruby --jit script.rb
- 禁用警告以提高速度:
bash ruby -W0 script.rb
7. 注意事项
- 编码优先级:命令行选项(如
-E
)优先于脚本内声明。 - Windows 特殊性:CMD 的编码问题需特别注意,推荐 PowerShell 或 Windows Terminal。
- 版本兼容性:Ruby 2.x 及以上对编码支持更完善,推荐 3.4.x。
- 社区资源:
- Ruby 官方文档(ruby-doc.org)
- Ruby China(ruby-china.org)
- Stack Overflow 的 Ruby 标签。
通过以上讲解,你可以熟练使用 Ruby 命令行选项处理中文脚本和相关任务。如果需要针对特定选项、场景(如 Rails 或批量处理)或问题的深入指导,请告诉我!