La riga Shebang con il comando `#! / Usr / bin / env --argument` non riesce su Linux


53

Ho una sceneggiatura semplice:

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

Sulla mia scatola OSX, funziona bene:

osx% ./script.rb
hi

Tuttavia, sulla mia scatola di Linux, genera un errore

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

Se eseguo manualmente la linea Shebang, funziona benissimo

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

Ma posso replicare l'errore se inserisco ruby --verboseun singolo argomento inenv

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

Quindi penso che questo sia un problema con l' envinterpretazione del reset della linea shebang. Sto usando 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.

Questo sembra davvero strano. È un problema comune con questa versione envo c'è qualcos'altro che non conosco qui?



Lo stesso qui con coreutils 8.17. Strano. Riferire a Fedora, poiché ciò va esplicitamente contro ciò che dice il manuale.
vonbrand,

@vonbrand Cosa ha detto Fedora? "Non ci interessa."
cat

Risposte:


44

Sembra che questo perché Linux (a differenza di BSD) passa solo un singolo argomento al comando shebang (in questo caso env).

Questo è stato ampiamente discusso su StackOverflow .


3
vedi anche questa pagina per una revisione del comportamento su diversi Unices.
Stéphane Chazelas,

4
Specifica non riuscita. Mio Dio.
Konrad Rudolph,

3
Se per "specifica non riuscita" intendi che tutti i sistemi Unix dovrebbero accettare più di 1 argomento, allora sono d'accordo con te al 100% :)
Alexander Mills

Non tanto "linux" quanto GNU.
sarà il

5

Ho trovato questo tramite il commento di @rampion:

Quello che succede è che il kernel elabora i primi due caratteri del file cercando # !. Se vengono trovati, salta tutti i caratteri spaziali alla ricerca di un carattere non spaziale ed estrae il percorso dell'interprete che deve essere un vero eseguibile e non un altro script, sebbene Linux lo estenda per consentire l'elaborazione di script ricorsivi. Avendo scoperto che poi salta al primo carattere non spaziale dove prende da lì al carattere newline successivo e lo passa come singolo argomento al comando. Non esiste l'elaborazione "shell" di virgolette o altri meta-caratteri. È tutta una forza molto semplice e brutale. Pertanto non è possibile avere fantasia con le opzioni lì. Ottieni esattamente un argomento incluso lo spazio bianco e 'perl -w' è ciò che il kernel vede qui e passa.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.