2011-01-24 30 views
7

Có cách nào để nắm bắt lỗi "lệnh không tìm thấy" trong tập lệnh Ruby không? Ví dụ: được cung cấp:Chụp lỗi "lệnh không tìm thấy" từ dấu gạch chéo ngược của Ruby?

output = `foo` 

Làm cách nào để bẫy tình huống foo chưa được cài đặt? Tôi hy vọng rằng tôi có thể rescue một ngoại lệ, nhưng điều này dường như không hoạt động trên 1.8.7. Có cách nào khác để gọi quy trình con sẽ thực hiện những gì tôi muốn không? Hoặc có cách tiếp cận khác không?

Cập nhật

lời xin lỗi của tôi, tôi quên đề cập đến một yêu cầu ẩn: Tôi muốn rằng người phiên dịch không bị rò rỉ dòng lệnh cho người sử dụng (nó có thể chứa dữ liệu nhạy cảm), do vậy tại sao các ngoại lệ phương pháp đánh bắt được ưa thích. Xin lỗi lần nữa vì đã rời khỏi đây lần đầu tiên.

+0

Một chiến thuật đó là hữu ích khi bạn cần một tính năng đặc biệt, là để chạy kiểm tra trước, hãy tìm kiếm tính năng hoặc ứng dụng hoặc mã trước tiên trước khi cố gắng chạy nó. Nói 'which' foo'' hoặc sử dụng một vài bài kiểm tra File để tìm kiếm sự tồn tại của tập tin cộng với khả năng thực thi của nó, sẽ cho bạn biết nó có an toàn để tiếp tục mà không thực sự cố gắng thực hiện lệnh và không. Nó làm cho trải nghiệm người dùng tốt hơn bởi vì bạn có thể kiểm soát cách bạn phản ứng với chức năng bị thiếu và chuyển sang tuyến đường thay thế hoặc thông báo cho người dùng mà bạn không thể tiến hành vì thiếu thứ gì đó. –

+0

Đồng ý, nhưng 'cái' foo'' không phải là nền tảng chéo, và tôi không thể nghĩ ra một cách đa nền tảng để làm điều đó khác hơn là thử nó và bắt lỗi ... – kfb

Trả lời

13

Sử dụng mã trả lại!

irb(main):001:0> `date` 
=> "Mo 24. Jan 16:07:15 CET 2011\n" 
irb(main):002:0> $? 
=> #<Process::Status: pid=11556,exited(0)> 
irb(main):003:0> $?.to_i 
=> 0 
irb(main):004:0> `foo` 
(irb):4: command not found: foo 
=> "" 
irb(main):005:0> $?.to_i 
=> 32512 

http://corelib.rubyonrails.org/classes/Process/Status.html

chuyển hướng thiết bị lỗi chuẩn để STDOUT sẽ cung cấp cho bạn kết quả như giá trị trả về thay vì đầy hơi nó chỉ ra:

irb(main):010:0> `foo 2>&1` 
=> "sh: foo: not found\n" 
irb(main):011:0> $?.to_i 
=> 32512 
+0

Cảm ơn! Tuy nhiên tôi quên đề cập đến một yêu cầu bổ sung không bị rò rỉ dòng lệnh trở lại; nếu tôi hiểu chính xác điều này sẽ vẫn hiển thị lệnh không tìm thấy thông báo cho người dùng. – kfb

+0

Đã thêm ví dụ về cách thực hiện việc này cho câu trả lời của tôi. –

+0

Hoạt động như một sự quyến rũ! Cảm ơn! – kfb

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