2009-08-06 2 views
9

Tôi đang cố gắng chạy lệnh từ ruby ​​qua system (hoặc bằng cách sử dụng dấu gạch chéo ngược), nhưng đang gặp sự cố. Khi tôi cố gắng gọi một lệnh, hệ vỏ không thể tìm thấy nó, mặc dù tôi biết nó hoạt động nếu tôi gọi nó là thẳng. Ví dụ:Làm cách nào để chỉ định trình bao để sử dụng cho cuộc gọi hệ thống ruby?

`zip` 
>> sh: zip: command not found 

Vấn đề có vẻ là ruby ​​đó là sử dụng các sh vỏ, trong đó $PATH không được thiết lập một cách chính xác, chứ không phải là bash, và tôi không chắc chắn lý do tại sao. Người dùng ứng dụng của tôi đang chạy được thiết lập để sử dụng bash theo mặc định.

Có cách nào để yêu cầu Ruby sử dụng bash thay vì sh?

Trả lời

0

Tại sao không chỉ định đường dẫn đầy đủ mà tệp zip thực thi.

+0

Yah, tôi có thể. Lý do tôi không có là nó đã được phát triển trong nhiều môi trường phát triển, và con đường không nhất thiết phải giống nhau trên tất cả chúng. –

+2

một lệnh như whereis nên luôn luôn ở trong đường dẫn. hoặc phổ biến nơi trong tất cả các distro/usr/bin/whereis này có thể là một giải pháp tốt cho việc tìm kiếm thùng có thể được phân tán. –

4

Tôi đoán rằng Ruby sử dụng hàm system() C, sử dụng /bin/sh. Trong hầu hết các hệ thống, /bin/sh chỉ là một liên kết tượng trưng với trình bao khác, vì vậy bạn có thể thay đổi thành bất kỳ thứ gì bạn muốn

+0

Hm./bin/sh thực sự là một liên kết tượng trưng ... đến/bin/bash! Vì vậy, đối với một số lý do nó đặt 'PATH' là một cái gì đó khác với nó bình thường? –

9

Theo như tôi biết, cách duy nhất để thực hiện điều đó là gọi trình bao một cách rõ ràng, ví dụ:

`bash -c zip` 

hoặc

`#{ ENV['SHELL'] } -c zip` 

Hoặc với hệ thống: system("bash", "-c", command)

Tuy nhiên ruby ​​(và tất cả các quá trình sinh ra bởi ruby) nên thừa hưởng môi trường các quá trình cha mẹ và do đó đã $ PATH thiết lập một cách chính xác ngay cả khi sử dụng một trình bao khác. Bạn có thể chạy ruby ​​từ một công việc cron hoặc init script hoặc tương tự, nơi PATH chỉ đơn giản là không được thiết lập chính xác?

+0

Cuộc gọi đang được thực hiện từ web, không phải từ cron hoặc dưới dạng tập lệnh. Có thể apache đang thay đổi con đường của tôi? –

+1

Điều đó rất có thể là trường hợp có. (Vâng có lẽ apache không thay đổi PATH, nhưng PATH đã không được thiết lập để giá trị thông thường của nó, bởi vì các tập tin rc của bạn không có nguồn gốc trước khi gọi apache). – sepp2k

+0

Nếu bạn cần thay 'zip' bằng lệnh nhiều từ và bạn không thể sử dụng nhiều đối số (ví dụ' IO.popen'), hãy sử dụng dấu ngoặc kép thoát, như 'hệ thống (" bash -c \ "thức ăn cho mèo \ "") ' –