Ruby, một ngôn ngữ tuyệt vời phù hợp cho shell script
(lucasoshiro.github.io)- Ruby thường chủ yếu được gắn với framework Rails nên nhiều khi người ta quên mất những điểm xuất sắc của ngôn ngữ này
- Ruby là một ngôn ngữ rất phong phú và hoàn thiện, đặc biệt hữu ích khi viết các shell script phức tạp
- Mục tiêu của bài viết này
- cho thấy các tính năng của Ruby hữu ích khi viết shell script, và so sánh với Bash và Python
- không nhằm thay thế hoàn toàn Bash script bằng Ruby script
Tính năng 1: Gọi lệnh bên ngoài
- Khi gọi lệnh bên ngoài trong Ruby, dùng dấu backtick(```).
- Ví dụ, dùng backtick có thể lưu đầu ra của lệnh bên ngoài vào biến.
- Cũng có thể dùng
systemhoặcpopen.`ls` - Có thể lưu đầu ra của lệnh vào biến.
my_date=`date`
Tính năng 2: Mã trạng thái
- Có thể kiểm tra mã trạng thái của lệnh cuối cùng bằng biến
$? - Rất giống với Bash
`true` puts $? # 0 `false` puts $? # 1
Tính năng 3: Ngôn ngữ có kiểu
- Ruby không phải là ngôn ngữ kiểu tĩnh, nhưng vẫn có kiểu.
- Đây là ngôn ngữ hướng đối tượng, mọi thứ đều được xử lý như một object.
- Không như Bash, có thể dùng an toàn các kiểu dữ liệu ngoài chuỗi.
total_lines = `wc -l my_file`.to_i # số nguyên chứa số dòng của tệp half = total_lines.div 2 # chia số nguyên puts `head -n #{half} my_file` # in ra một nửa tệp
Tính năng 4: Cấu thành hàm
- Ruby triển khai các phép toán hàm như
map,select(lọc),reduce,flat_mapdưới dạng method. - Có thể áp dụng
maplên đầu ra của lệnh.puts `ls`.lines.map { |name| name.strip.length } # in ra độ dài tên tệp
Tính năng 5: So khớp biểu thức chính quy
- Trong Ruby, regex là một kiểu dữ liệu và có sẵn các phép toán dùng regex.
- Ví dụ, cách lấy tên branch git hiện tại:
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # so khớp chuỗi với regex puts $1 # in ra phần khớp của nhóm đầu tiên end end
Tính năng 6: Thread dễ dùng
- Ruby giúp xử lý nhiều thread rất dễ dàng
- Ví dụ, hữu ích khi tải nhiều tệp cùng lúc
(1..10).map do |i| # lặp từ 1 đến 10 Thread.new do `wget http://my_site.com/file_#{i}` # có thể dùng biến trong lệnh end end.each { |thread| thread.join } # do/end và dấu ngoặc nhọn có cùng mục đích
Tính năng 7: Thao tác tệp và thư mục tích hợp sẵn
- Trong Ruby, mọi thao tác tệp được cung cấp dưới dạng method của lớp
File, còn thao tác thư mục là method của lớpDir. - Không như Python, có thể xử lý tệp và thư mục theo cách nhất quán.
exists = File.exists? 'My File' # method trả về boolean kết thúc bằng '?' file_content = File.open('My File').read File.delete 'My File' # dấu ngoặc là tùy chọn nếu không gây mơ hồ
Kết luận
- Khuyến nghị cân nhắc Ruby khi thay thế các shell script phức tạp
- Tất nhiên không phải là bảo phải bỏ hẳn Bash, nhưng với các tác vụ phức tạp thì Ruby có thể là lựa chọn tốt hơn
- Cũng có thể làm bằng Python, Perl, JS..., nhưng cá nhân tôi thấy Ruby là ngôn ngữ hoàn thiện nhất và dễ dùng nhất
Ý kiến của GN⁺
- Ruby hỗ trợ cả lập trình hướng đối tượng lẫn lập trình hàm, nên có thể đáp ứng nhiều phong cách lập trình khác nhau.
- So với Python, Ruby theo đuổi mô hình hướng đối tượng nghiêm ngặt hơn.
- Khi viết shell script, độ phức tạp càng cao thì ưu điểm của Ruby càng nổi bật.
- Tính năng xử lý thread của Ruby giúp việc triển khai tác vụ song song trở nên dễ dàng.
- Các thao tác tệp và thư mục được cung cấp trực quan và nhất quán, giúp tăng năng suất.
3 bình luận
Dùng để viết script cũng ổn đấy nhỉ haha, không rõ phiên bản nào nhưng trên mac cũng được cài sẵn mặc định mà,,?!
Ruby từng là ngôn ngữ tôi rất yêu thích... Mong rằng dù theo cách này(?) thì nó vẫn sẽ còn là một ngôn ngữ được nhiều người yêu mến.
Ý kiến trên Hacker News
binding.irbhoặcbinding.pry.Pathnamesẽ cho API tự nhiên hơnFile.Parallelthì việc xử lý song song còn thuận tiện hơn.