4 cách khác nhau chạy câu lệnh Shell trong Ruby
Chạy câu lệnh Shell trong ứng dụng nói chung và ứng dụng Ruby nói riêng là một công việc không phải là hiếm gặp. Chúng ta có thể sử dụng nhiều cách khác nhau như gọi tới một service API riêng biệt khác hoặc đơn giản là kiểm tra xem ngôn ngữ hiện tại có cung cấp sẵn API để làm công việc này hay ...
Chạy câu lệnh Shell trong ứng dụng nói chung và ứng dụng Ruby nói riêng là một công việc không phải là hiếm gặp. Chúng ta có thể sử dụng nhiều cách khác nhau như gọi tới một service API riêng biệt khác hoặc đơn giản là kiểm tra xem ngôn ngữ hiện tại có cung cấp sẵn API để làm công việc này hay không nếu có thì sử dụng API đó. Trong bài viết này chúng ta sẽ tìm hiểu 4 cách làm khác nhau để chạy câu lệnh Shell trong ứng dụng Ruby sử dụng chính API cung cấp bởi ngôn ngữ lập trình kịch bản này.
Sử Dụng Kernel#backtick
Ví dụ:
output = `echo 'hi'`
Theo cách này chỉ cần đặt câu lệnh cần thực thi giữa cặp dấu backtick ...``. Cú pháp này giống với cú pháp của các ngôn ngữ lập trình kịch bản khác như Bash, PHP, Perl.
Chúng ta cũng có thể sử dụng cú pháp string interpolation (#{}) để lấy ra giá trị kiểu chuỗi từ giá trị của biến:
# biến `cmd` chứa một câu lệnh theo dạng chuỗi cmd = "echo 'Hello World!'" output = `#{cmd}`
Sử Dụng: %x( cmd )
Ví dụ:
output = %x( echo 'hi' )
Sau ký tự x là một delimiter và do đó bạn có thể sử dụng bất cứ ký tự nào tuỳ ý:
output = %x- echo 'hi' -
Nếu delimiter là một trong số các ký tự (, [, { hoặc < thì ký tự delimiter kết thúc sẽ tương ứng với ), ], }, }.
Ngoài ra, chúng ta có thể sử dụng cú pháp string interpolation trong Ruby:
cmd = "echo 'hi'" output = %x( #{cmd} )
Hoặc:
hello = "Hello World!" output = %x(echo #{hello} )
Sử Dụng Kernel#system
Ví dụ:
output = system( "echo 'hi'" )
Hoặc:
output = system( cmd )
Kernel#system sẽ trả về true nếu câu lệnh được thực thi thành công và false trong trường hợp ngược lại.
Sử Dụng Kernel#exec
Ví dụ:
exec( "echo 'hi'" )
Hoặc:
exec( cmd )
Lưu ý rằng Kernel#exec sẽ tạo ra một process mới thay thế (và chấm dứt) hoàn toàn process đang chạy hiện tại và trả về none. Do đó trong câu lệnh sau:
exec( "echo 'hi'" ) exec( cmd )
Thì câu lệnh thứ 2 sẽ không bao giờ được chạy.