Dòng Shebang với lệnh `#! / Usr / bin / env --argument` không thành công trên Linux


53

Tôi đã có một kịch bản đơn giản:

#!/usr/bin/env ruby --verbose
# script.rb
puts "hi"

Trên hộp OSX của tôi, nó chạy tốt:

osx% ./script.rb
hi

Tuy nhiên, trên hộp linux của tôi, nó bị lỗi

linux% ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

Nếu tôi chạy dòng shebang bằng tay, nó hoạt động tốt

linux% /usr/bin/env ruby --verbose ./script.rb
hi

Nhưng tôi có thể sao chép lỗi nếu tôi đóng gói ruby --verbosethành một đối số duy nhất đểenv

linux% /usr/bin/env "ruby --verbose" ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

Vì vậy, tôi nghĩ rằng đây là một vấn đề với cách envdiễn giải việc thiết lập lại dòng shebang. Tôi đang sử dụng GNU coreutils 8.4 env:

linux% /usr/bin/env --version
env (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard Mlynarik and David MacKenzie.

Điều này có vẻ thực sự kỳ lạ. Đây có phải là một vấn đề phổ biến với phiên bản này envhay không, có điều gì khác đang xảy ra ở đây mà tôi không biết?



Tương tự ở đây với coreutils 8.17. Kỳ dị. Báo cáo với Fedora, vì điều này đi ngược lại với những gì hướng dẫn sử dụng nói.
vonbrand

@vonbrand Fedora đã nói gì? "Chúng tôi không quan tâm."
con mèo

Câu trả lời:


44

Có vẻ như điều này là do Linux (không giống như BSD) chỉ chuyển một đối số duy nhất cho lệnh shebang (trong trường hợp này là env).

Điều này đã được thảo luận rộng rãi trên StackOverflow .


3
xem thêm trang này để xem xét hành vi trên các Thông báo khác nhau.
Stéphane Chazelas

4
Thông số kỹ thuật thất bại. Chúa tôi.
Konrad Rudolph

3
Nếu "đặc tả không thành công", bạn có nghĩa là tất cả các hệ thống Unix nên chấp nhận nhiều hơn 1 đối số, thì tôi đồng ý 100% với bạn :)
Alexander Mills

Không quá nhiều 'linux' như GNU.
sẽ

5

Tìm thấy điều này qua bình luận @rampion:

Điều gì xảy ra là kernel xử lý hai ký tự đầu tiên của tệp đang tìm kiếm #!. Nếu chúng được tìm thấy thì nó bỏ qua tất cả các ký tự khoảng trắng tìm kiếm một ký tự không phải khoảng trắng và trích xuất đường dẫn trình thông dịch phải là tệp thực thi thực sự và không phải là một tập lệnh khác, mặc dù linux mở rộng điều đó để cho phép xử lý tập lệnh đệ quy. Nhận thấy rằng sau đó nó bỏ qua ký tự không phải không gian đầu tiên, từ đó đến ký tự dòng mới tiếp theo và chuyển nó dưới dạng một đối số duy nhất cho lệnh. Không có xử lý 'shell' của dấu ngoặc kép hoặc các ký tự meta khác. Đó là tất cả rất đơn giản và vũ phu. Vì vậy, bạn không thể có được ưa thích với các tùy chọn ở đó. Bạn nhận được chính xác một khoảng trắng đối số được bao gồm và 'perl -w' là những gì kernel nhìn thấy ở đây và truyền lại.

Nguồn: http://lists.gnu.org/archive/html/orms-sh-utils/2002-04/msg00020.html

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.