2011-08-03 24 views
26

Ok này là lái xe cho tôi điên:của Ruby thoát argv luận hoặc chuỗi như là đối số để shell lệnh

`ls #{"/media/music/Miles Davis"}` 

thất bại vì không gian giữa "Miles" và "Davis"

Giả sử tôi viết một viên hồng ngọc tập lệnh và người dùng chuyển đường dẫn tệp dưới dạng đối số. Làm thế nào để thoát khỏi nó và nạp vào một lệnh shell-out. Vâng, vâng, tôi biết, bắn phá nên tránh. Nhưng đây là một ví dụ giả tạo, tôi vẫn cần điều này.

Tôi sẽ làm system("ls", ARGV[0]), nhưng nó không trả lại kết quả đầu ra của ls dưới dạng chuỗi, đó là điều ngược lại.

Làm cách nào để thoát khỏi bất kỳ thứ gì bạn chèn vào trình băm không?

Trả lời

51

Sử dụng require 'shellwords'Shellwords.escape, mà sẽ sửa chữa loại công cụ này dành cho bạn:

http://apidock.com/ruby/Shellwords/shellescape

+2

Tuyệt vời! Cảm ơn bạn! Không biết về mô-đun đó. – ulver

+0

Bạn cũng có thể sử dụng phím tắt 'Chuỗi # shellescape', như sau: ' ls # {"/ media/music/Miles Davis" .shellescape} ' – cgenco

-2

dấu ngoặc kép cũng làm việc:

`ls "#{'/media/music/Miles Davis'}"` 

hoặc

`ls "#{ARGV[0]}"` 
+0

Đừng làm điều đó. Hãy xem xét: 'a = '-l" | wc -l # "';' '' ls "# {a}" '' – Mike

+0

Điều này làm việc cho không gian, nhưng không thành chuỗi của bạn có '" ', '$', hoặc một số ký tự khác. – Carpetsmoker

6

St ay tránh việc xây dựng các chuỗi vỏ bất cứ khi nào có thể, nó là một vectơ tốt để thực thi mã tùy ý.

Trong trường hợp này, bạn có thể sử dụng popen, mà không thoát ra cho bạn:

IO.popen(['printf', 'a b']) do |f| 
    var = f.read 
end 
+1

Điều này sẽ có nhiều upvotes hơn, popen cũng cho phép in ra một phản ứng được truyền tải khá thuận tiện, ví dụ: (line = f.gets) {puts line} – vise

+0

Đây là một phiên bản nhỏ gọn hơn: 'IO.popen ([" tệp "," --brief "," --mime-type ", untrustworthy_input], trong:: close, err:: close) .read' – aidan

Các vấn đề liên quan