2008-10-05 26 views

Trả lời

8

Nếu bạn sử dụng phương thức Kernel.system(), nó sẽ trả về boolean cho biết sự thành công của lệnh.

result = system("cp -r dir1 dir2") 
if(result) 
#do the next thing 
else 
# handle the error 

Có so sánh tốt các lệnh hệ thống ruby ​​khác nhau here.

-4

Để cập nhật SVN, hãy kiểm tra số phiên bản trước và sau khi cập nhật.

svn_start_version = IO.popen("svn info").readlines[4] 
`svn update` 
svn_end_version = IO.popen("svn info").readlines[4] 
if svn_end_version > svn_start_version 
    "success" 
end 

Đối với cp, bạn có thể thực hiện kiểm tra kích cỡ tệp gốc bằng tệp được sao chép.

source_file_size = IO.popen("du file1").readlines 
`cp file1 file2` 
dest_file_size = IO.popen("du file2").readlines 
if dest_file_size == source_file_size 
    "success" 
end 
+0

Điều gì xảy ra nếu kho lưu trữ lật đổ không thay đổi? Mã của bạn sẽ cho biết lỗi. Điều gì xảy ra nếu nội dung tập tin đã thay đổi nhưng không phải số lượng khối được phân bổ (và thao tác sao chép không thành công)? Mã của bạn sẽ cho biết thành công. –

2

Bạn thực hiện các lệnh bên ngoài như thế nào? Hàm Ruby system() trả về true hoặc false tùy thuộc vào việc lệnh có thành công hay không. Ngoài ra, $? có trạng thái lỗi.

1
  1. Chỉ cần được pedantic, bạn không thể xác nhận một 'lệnh d vì exec thay thế chương trình hiện hành với exec' exec d lệnh, do đó lệnh sẽ không bao giờ quay trở lại của Ruby để xác nhận.
  2. Đối với cp, ít nhất, bạn có lẽ sẽ tốt hơn khi sử dụng mô-đun FileUtils (một phần của Thư viện chuẩn của Ruby), thay vì thả vào vỏ.
  3. Như đã lưu ý ở trên, biến số được xác định trước $? sẽ cung cấp cho bạn mã trả về của lệnh cuối cùng được thực thi bởi system() hoặc toán tử backtick.
+0

Vâng, exec thực sự đã ném tôi khi tôi lần đầu tiên bắt đầu lập trình ruby. Về cơ bản, không sử dụng nó! –