2010-03-27 7 views
9

Come si imposta la modalità di contaminazione in uno script perl con unCome impostare la modalità di contaminazione in uno script perl con un '#!/Usr/bin/env perl'-shebang?

#!/usr/bin/env perl 

la baracca?

+2

È utile se non è possibile prevedere la posizione del binario perl (/ usr/bin o/usr/local/bin). http://www.perlmonks.org/?node_id=716740 - Credo che la domanda sia se si può predire la posizione di env ... –

+3

Sul mio PC io uso/usr/local/bin/perl e sul mio netbook/usr/bin/perl. Quindi con/usr/bin/env perl non devo cambiare i miei script perl. E suppongo che spediranno la prossima versione del mio sistema operativo con la versione 5.10.1 di perl, quindi forse userò nuovamente il mio PC onboard-perl con/usr/bin/perl e anche lì non dovrò cambiare le mie shebang. –

+0

Gavin, la posizione di 'env' è standardizzata. – daxim

risposta

11

Si può passare la variabile d'ambiente PERL5OPT sulla linea shebang:

#!/usr/bin/env PERL5OPT=-T perl 

Questo mi sembra piuttosto al contrario.

Un'altra opzione, è quello di ri-eseguire lo script in modalità macchia se si rileva che non è su:

#!/usr/bin/env perl 

warn 'Taint mode is '.(${^TAINT} ? 'on' : 'off'); # For debugging 

exec($^X,'-T',$0,@ARGV) unless ${^TAINT}; 

# do stuff under taint mode here 

Ovviamente, questo è un grande successo prestazioni di avvio.

+3

Non è possibile specificare una variabile in uno shebang con/usr/bin/env. Ciò farà sì che env esegua se stesso in un ciclo infinito, senza mai arrivare al comando richiesto. L'ho testato sia su Linux che su FreeBSD. – Zed

+1

Sì - sembra essere solo OS-X che attualmente supporta il primo incantesimo. –

2

Dal modalità macchia può essere attivata solo tramite la bandiera -T, e env non accetterà alcuna bandiere in uno shebang, la soluzione migliore è quella di eseguire il programma tramite perl -T script.pl piuttosto che eseguire direttamente lo script.

Se è assolutamente necessario per far rispettare la modalità taint nella baracca, si potrebbe fare uno script taintperl da qualche parte nel PATH (ad esempio,/usr/local/bin) con il seguente contenuto:

#!/bin/sh 
/usr/bin/env perl -T 

Poi, nel tuo script Perl, hanno

#!/usr/bin/env taintperl 
+0

In molti sistemi operativi, non puoi usare uno script interpretato come interprete di script. Dovresti farlo in un linguaggio compilato, ad es. C –

+2

@GavinBrock Questo vale per il programma menzionato immediatamente dopo '#!'. Qui è '/ usr/bin/env', che è compilato. A sua volta, 'env' non si preoccupa se' taintperl' è un programma compilato o meno. – maxelost