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 或批量处理)或问题的深入指导,请告诉我!