Làm thế nào để bạn chỉ định thông dịch viên kịch bản thay thế (shebangs)?


8

Trong tệp thực thi, bạn chỉ định môi trường bằng shebang:

#!/usr/bin/env ruby

# ruby code here

Nhưng nếu bạn muốn chỉ định nhiều môi trường có thể thì sao? Ví dụ: nếu bạn đã cài đặt nhiều phiên bản Ruby, bạn có thể muốn làm một cái gì đó như

#!/path/to/better/ruby/version
#!/path/to/alternative/ruby/version

# ruby code here

Làm thế nào bạn có thể chỉ định nhiều môi trường có thể cho một tệp thực thi?

Câu trả lời:


6

Câu trả lời ngắn gọn là bạn không thể.

Ý tưởng đằng sau việc sử dụng #!/usr/bin/env rubythay vì chỉ đơn giản #!/usr/bin/rubylà sử dụng bất cứ thứ gì nhị phân ruby ​​là đầu tiên trong đường dẫn của người dùng. Sau đó, tập lệnh của bạn không phụ thuộc vào ruby ​​ở cùng một vị trí trên mọi hệ thống; sau khi tất cả, một 'bình thường' ruby vị trí có thể /usr/bin/ruby, /usr/local/bin/ruby, /opt/ruby-1.8.7/bin/ruby, vv ...

Nếu bạn DID muốn mã hóa một số giá trị hoặc thực hiện một số logic tìm kiếm, bạn luôn có thể tạo tập lệnh trình bao bọc:

#!/bin/sh

for ruby in /usr/bin/ruby /usr/local/bin/ruby
do
    if [ -x "$ruby" ]
    then
        "$ruby" myscript.rb
        break
    fi
done

Và nếu bạn có đủ động lực, bạn thậm chí có thể nhúng một tập lệnh ruby ​​(hoặc khác) bên trong tập lệnh shell.


Điều đó có ý nghĩa. Tôi dự định chạy tập lệnh này trên nhiều máy, mỗi máy có một đường dẫn khác nhau tới Ruby 1.9 và tất cả chúng không sử dụng Ruby 1.9 làm trình thông dịch mặc định. Tôi sẽ thử sử dụng tập lệnh bao bọc. Cảm ơn!
sffc

1
Đừng quên $@khi gọi kịch bản cuối cùng để chuyển tiếp các cuộc tranh luận có thể:"$ruby" myscript.rb $@
Leonardo Raele

1

Tôi sẽ mâu thuẫn với mrb và nói rằng bạn có thể thay thế, mà không thay đổi "#!" hàng.

Giả sử bạn có một tập lệnh ruby ​​với #!/usr/bin/env rubydòng đầu tiên.

Bạn muốn /path/to/better/ruby/version/whateverchạy tập lệnh, bạn đặt biến môi trường PATH thành /path/to/better/ruby/versionđầu tiên:

PATH=/path/to/better/ruby/version:$PATH  whatever_script_name_is

Bạn muốn /usr/local/bin/rubychạy script? Đặt PATH thích hợp:

PATH=/usr/local/bin:$PATH  whatever_script_name_is

Lưu ý rằng việc đấu tranh với PATH có thể gây ra các vấn đề khác trong trường hợp ruby ​​thực thi mà bạn muốn chạy tập lệnh nằm trong cùng thư mục với các chương trình thay thế khác. Ví dụ: nếu /usr/local/bincó BSD cat, grepthì sedtrong đó cũng như rubykhi bạn đặt, PATH=/usr/local/bin:$PATHbạn sẽ nhận được các tệp thực thi BSD thay vì các tệp thực thi của Linux. Đó có thể là một vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.