12 điểm bởi GN⁺ 2024-06-24 | 3 bình luận | Chia sẻ qua WhatsApp
  • 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 system hoặc popen.
    `ls`  
    
  • Có thể lưu đầu ra của lệnh vào biến.
    my_date=`date`  
    
Quảng cáo

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_map dưới dạng method.
  • Có thể áp dụng map lên đầu ra của lệnh.
    puts `ls`.lines.map { |name| name.strip.length } # in ra độ dài tên tệp  
    
    Quảng cáo

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  
    
    Quảng cáo

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ớp Dir.
  • 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

 
yangeok 2024-07-05

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à,,?!

 
botplaysdice 2024-06-24

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.

 
GN⁺ 2024-06-24
Ý kiến trên Hacker News
  • Ruby kế thừa nhiều tính năng shell scripting từ Perl và cung cấp các tùy chọn giúp tăng dần độ dễ đọc.
  • Có thể debug tương tác ngay trong script bằng binding.irb hoặc binding.pry.
  • Dùng Pathname sẽ cho API tự nhiên hơn File.
  • Có thể dùng dấu backtick (`) để chạy các lệnh shell đơn giản, nhưng với tác vụ phức tạp hơn thì có thể tận dụng thư viện chuẩn của Ruby.
  • Thread trong Ruby dễ dùng, và với Parallel thì việc xử lý song song còn thuận tiện hơn.
  • Ruby 2.6 được cài sẵn trên macOS vẫn dùng ổn, nhưng nên nâng cấp lên phiên bản mới hơn.
  • Ruby là một ngôn ngữ tuyệt vời, nhưng hỗ trợ từ editor vẫn kém hơn Python.
  • Việc dùng dấu backtick (`) để chạy lệnh shell là không hiệu quả và có thể hoạt động khác nhau tùy hệ điều hành.
  • Tính năng quản lý phụ thuộc inline của Ruby rất hữu ích và cung cấp khả năng tương tự Deno.
  • Ruby cho phép viết mã đẹp và phù hợp để viết các script nhỏ.
  • Ruby rất hữu ích để viết các script tự động hóa phức tạp và giúp làm việc dễ hơn bash hay PowerShell.
  • Ruby vẫn được dùng rất nhiều để viết script và công cụ tại các công ty vận hành monolith Rails quy mô lớn.
  • Trong môi trường không thể truy cập Internet, việc dùng ngôn ngữ đã được cài sẵn trong bản phân phối mặc định là rất quan trọng.
  • Ruby hữu ích khi viết script tự động hoàn thành cho shell và có thể nhanh chóng tạo ra các utility. Rails phù hợp để làm MVP.