2012-11-12 28 views
5

Tôi khá bối rối khi đọc tài liệu của phương thức của Ruby. Tôi không chắc chắn các lệnh là gì và các tùy chọn là gì. Tôi phải làm gì nếu tôi muốn thực hiện những điều sau đây?Đối số phương pháp hệ thống Ruby

wget -pk -nd -P /public/google www.google.com 

Vì lý do an ninh, tôi muốn sử dụng một trong những phiên bản mà không sử dụng vỏ (các hình thức thứ hai và thứ ba trong URL Tôi đưa cho, chứ không phải là người đầu tiên)

+1

Bạn có thể sử dụng backticks. – alex

+0

'tệp = hệ thống (wget -pk -nd -P/public/google www.google.com)'. Kiểm tra http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – nicooga

+0

Xin lỗi, chỉnh sửa này để làm rõ ý tôi. –

Trả lời

10

Hãy xem xét ví dụ sau:

system("echo *") 
system("echo", "*") 

Đầu tiên vượt qua chuỗi được phân tích cú pháp và thực thi; đó là lý do tại sao system('echo *') sản xuất cùng một đầu ra như nói rằng echo * từ dấu nhắc trình bao: bạn sẽ nhận được một danh sách các tệp trong thư mục hiện tại. Biểu mẫu đối số tương ứng là:

commandline : command line string which is passed to the standard shell 

Thứ hai bỏ qua vỏ hoàn toàn. Nó sẽ tìm kiếm echo trong các PATH và sau đó thực hiện nó với chuỗi '*' làm đối số của nó. Vì shell mở rộng các ký tự đại diện (ít nhất là trên các hệ thống không đồng nhất), nên * sẽ giữ nguyên như một đơn giản * và bạn sẽ thấy * làm đầu ra. Các hình thức lập luận tương ứng ở đây là:

cmdname, arg1, ... : command name and one or more arguments (no shell) 

Hình thức thứ ba:

[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell) 

được sử dụng khi bạn muốn thực hiện cmdname nhưng có nó xuất hiện với một cái tên khác trong danh sách ps và như vậy. Bạn có thể thấy điều này trong hành động bằng cách mở hai thiết bị đầu cuối. Mở irb trong một trong số họ và nói:

system('sleep', '10') 

sau đó nhanh chóng chuyển sang người kia và nhìn vào danh sách ps. Bạn sẽ thấy sleep 10 trong đó. Nhưng, nếu bạn đưa cái này cho irb:

system(['sleep', 'pancakes'], '10') 

và kiểm tra việc niêm yết ps, bạn sẽ thấy pancakes 10. Các thủ thuật hai thiết bị tương tự sẽ hiển thị cho bạn shell -c sleep 10 nếu bạn nói system('sleep 10').

Nếu bạn cung cấp một Hash làm đối số đầu tiên, thì Hash đó được sử dụng làm biến môi trường cho quá trình sinh ra. Nếu bạn cung cấp một Hash làm đối số cuối cùng, thì Hash đó được sử dụng làm tùy chọn; tài liệu thêm về các đối số, như được ghi trong tài liệu system, có sẵn theo Kernel#spawn.

+0

Cảm ơn câu trả lời dài của bạn! Những gì tôi vẫn không hoàn toàn chắc chắn là, những gì được tính là một "đối số"?Có '-pk',' -nd', '-P','/public/google', 'www.google.com' được tính là một đối số không? –

+0

@MikaH .: Có, mỗi trong số đó là các đối số. –

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