`#! / Usr / bin / env komutlu Shebang satırı - argüman 'Linux'ta başarısız oluyor


53

Basit bir senaryom var:

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

OSX kutumda iyi çalışıyor:

osx% ./script.rb
hi

Ancak, linux kutumda bir hata atıyor

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

Shebang hattını manuel olarak çalıştırırsam, iyi çalışıyor

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

Ancak, ruby --verbosetek bir argümana toplanırsam hatayı çoğaltabilirim .env

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

Bu yüzden bunun envshebang hattının sıfırlanmasının nasıl yorumlanacağı ile ilgili bir sorun olduğunu düşünüyorum . GNU coreutils kullanıyorum 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.

Bu gerçekten garip görünüyor. Bu, bu sürümle ilgili ortak bir sorun envmu, yoksa bilmediğim bir şey mi var?



Coreutils ile aynı burada 8.17. Tuhaf. Bu, kılavuzun söylediklerine aykırı şekilde giderken, Fedora'ya rapor vermek.
von

@vonbrand Fedora ne dedi? "Umurumda değil."
kedi

Yanıtlar:


44

Görünüşe göre Linux (BSD'den farklı olarak) sadece shebang komutuna tek bir argüman ilettiğinden (bu durumda env).

Bu, StackOverflow'ta kapsamlı bir şekilde tartışılmıştır .


3
farklı Unices'deki davranışların gözden geçirilmesi için bu sayfaya bakın .
Stéphane Chazelas,

4
Spesifikasyon başarısız. Tanrım.
Konrad Rudolph

3
Eğer "şartname başarısız" derken, tüm Unix sistemlerinin 1'den fazla argümanı kabul etmesi gerektiğini kastediyorsanız, o zaman% 100 sizinle aynı fikirdeyim :)
Alexander Mills

GNU kadar çok 'linux' değil.
irade

5

Bunu @rampion yorumu aracılığıyla buldum:

Olan, çekirdeğin #! Dosyasını arayan dosyanın ilk iki karakterini işlemesidir. Bunlar bulunursa, boşluk içermeyen bir karakter arayan tüm boşluk karakterlerini atlar ve linux yinelemeli komut dosyası işlemesine izin verecek şekilde genişletilse de, gerçek bir yürütülebilir kod olması gereken yorumlayıcı yolunu çıkarır. Bunu bulduktan sonra, oradan bir sonraki yeni satır karakterine götürdüğü ilk boşluk olmayan karaktere atlar ve bunu komut için tek bir argüman olarak iletir. Tırnak veya diğer meta karakterlerin 'kabuk' işlenmesi yoktur. Hepsi çok basit ve kaba bir kuvvettir. Bu nedenle oradaki seçeneklerle süslü olamıyorsunuz. Beyaz boşluk dahil tam bir argüman alırsınız ve 'perl -w' çekirdeğin burada gördüğü ve geçtiği şeydir.

Kaynak: http://lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.