Shebang สอดคล้องกับคำสั่ง `#! / usr / bin / env - อาร์กิวเมนต์ 'ล้มเหลวบน Linux


53

ฉันมีสคริปต์ง่าย ๆ :

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

บนกล่อง OSX ของฉันก็จะทำงานได้ดี:

osx% ./script.rb
hi

อย่างไรก็ตามในกล่อง linux ของฉันมันมีข้อผิดพลาดเกิดขึ้น

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

ถ้าฉันเรียกใช้ shebang line ด้วยตนเองมันก็ใช้ได้ดี

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

แต่ฉันสามารถทำซ้ำข้อผิดพลาดถ้าฉันแพ็คruby --verboseเป็นอาร์กิวเมนต์เดียวไปenv

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

ดังนั้นฉันคิดว่านี่เป็นปัญหาเกี่ยวกับวิธีการenvตีความการรีเซ็ตบรรทัด shebang ฉันใช้ 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.

ดูเหมือนจะแปลกจริงๆ นี่เป็นปัญหาทั่วไปของเวอร์ชันนี้envหรือมีสิ่งอื่นที่เกิดขึ้นที่ฉันไม่รู้หรือไม่



เช่นเดียวกันกับ coreutils 8.17 แปลก. การรายงานไปยัง Fedora เนื่องจากสิ่งนี้ขัดกับคู่มืออย่างชัดเจน
vonbrand

@vonbrand Fedora พูดว่าอะไร? "เราไม่สนใจ"
แมว

คำตอบ:


44

ดูเหมือนว่านี่เป็นเพราะ Linux (ไม่เหมือน BSD) ส่งผ่านอาร์กิวเมนต์เดียวไปยังคำสั่ง shebang (ในกรณีนี้ env)

นี้ได้รับการกล่าวถึงอย่างกว้างขวางใน StackOverflow


3
ดูหน้านี้สำหรับการตรวจสอบพฤติกรรมใน Unices ต่าง ๆ
Stéphane Chazelas

4
ข้อมูลจำเพาะล้มเหลว พระเจ้า.
Konrad Rudolph

3
ถ้าโดย "ข้อมูลจำเพาะล้มเหลว" คุณหมายถึงระบบ Unix ทั้งหมดควรยอมรับอาร์กิวเมนต์มากกว่า 1 ข้อดังนั้นฉัน 100% เห็นด้วยกับคุณ :)
Alexander Mills

'ลินุกซ์' ไม่มากอย่าง GNU
จะ

5

พบสิ่งนี้ผ่านทางความคิดเห็น @rampion:

สิ่งที่เกิดขึ้นคือเคอร์เนลประมวลผลอักขระสองตัวแรกของไฟล์ที่ค้นหา #! หากพบสิ่งเหล่านั้นจะข้ามอักขระช่องว่างทั้งหมดที่ค้นหาอักขระที่ไม่ใช่ช่องว่างและแยกพา ธ ของล่ามซึ่งต้องใช้งานได้จริงและไม่ใช่สคริปต์อื่นแม้ว่า linux จะขยายเพื่อให้สามารถประมวลผลสคริปต์แบบเรียกซ้ำ หลังจากพบว่ามันข้ามไปยังอักขระที่ไม่ใช่ช่องว่างตัวแรกที่ใช้จากที่นั่นไปยังอักขระบรรทัดใหม่ถัดไปและส่งผ่านเป็นอาร์กิวเมนต์เดียวไปยังคำสั่ง ไม่มีการประมวลผล 'อัญประกาศ' ของเครื่องหมายคำพูดหรืออักขระเมตาอื่น ๆ มันเป็นเรื่องง่ายมากและกำลังดุร้าย ดังนั้นคุณไม่สามารถรับแฟนซีด้วยตัวเลือกที่นั่น คุณจะได้รับหนึ่งช่องว่างอาร์กิวเมนต์สีขาวรวมและ 'perl -w' เป็นสิ่งที่เคอร์เนลเห็นที่นี่และส่งต่อ

ที่มา: http://lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.