Tôi đang viết một ứng dụng Rails nhanh chóng và đã tự hỏi làm thế nào tôi có thể xác nhận sự thành công một lệnh exec'd. Hai lệnh tôi đang chạy là và SVN cập nhật, và một cp từ một thư mục khác.Cách tốt nhất để xác thực lệnh đầu cuối đã chạy thành công trong Rails là gì?
6
A
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
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
- 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ớiexec
'exec
d lệnh, do đó lệnh sẽ không bao giờ quay trở lại của Ruby để xác nhận. - Đố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ỏ.
- 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ởisystem()
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ó! –
Đ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. –