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
.
Bạn có thể sử dụng backticks. – alex
'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
Xin lỗi, chỉnh sửa này để làm rõ ý tôi. –