2012-06-29 9 views
7

Ho cercato su Google circa #!/usr/bin/perl, ma non ho trovato nessuna risposta soddisfacente. So che è una cosa piuttosto semplice, ma comunque, potrebbe spiegarmi qual è il significato di #!/usr/bin/perl in Perl? Inoltre, cosa significa -w o -T in #!/usr/bin/perl? Sono un novizio di Perl, quindi per favore sii paziente.Qual è il significato di -T o -w in #!/Usr/bin/perl?

+2

'#!/Usr/bin/perl' si chiama linea shebang. '-w' per gli avvisi. -T' per la modalità Taint. –

+4

'-w' non è stato raccomandato per molti anni. Dal Perl 5.6.0 abbiamo avuto 'use warnings', che è più potente e più flessibile. –

risposta

13

Il numero! viene comunemente chiamato "shebang" e comunica al computer come eseguire uno script. Vedrai anche molti script di shell con #!/bin/sh o #!/bin/bash.

Quindi, /usr/bin/perl è l'interprete Perl ed è eseguito e dato il file da eseguire.

Il resto della riga sono opzioni per Perl. Lo "-T" is tainting (significa che l'input è contrassegnato come "non attendibile" fino a quando non ne controlli il formato). "-w" attiva gli avvisi.

Per saperne di più eseguendo perldoc perlrun (perldoc è lettore documentazione del Perl, potrebbe essere installato, potrebbe essere nel suo pacchetto).

Per gli script si scrive mi sento di raccomandare loro di iniziare con:

#!/usr/bin/perl 
use warnings; 
use strict; 

Questo accende un sacco di avvertimenti e controlli supplementari - particolarmente utile mentre si sta imparando (che sto ancora imparando e ho usato Perl per più di 10 anni ora).

+0

Ecco una query. Quando ho bisogno di un altro file .pl in un file che contiene #!/Usr/bin/perl -T, genera un errore. Quando rimuovo -T, viene eseguito. Qual è la ragione? Grazie. – vijay

2

Si chiama shebang. Sui sistemi basati su Unix (OSX, Linux, ecc ...) quella linea indica il percorso dell'interprete linguistico quando lo script viene eseguito dalla riga di comando. Nel caso di perl/usr/bin/perl è il percorso dell'interprete perl. Se l'hashbang viene omesso, i sistemi * nix non sapranno come analizzare lo script quando invocato come eseguibile. Proverà invece a interpretare lo script in qualunque shell l'utente stia eseguendo (probabilmente bash) e interromperà lo script.

http://en.wikipedia.org/wiki/Hashbang

Il -W e -T sono argomenti che Controll il modo in cui l'interprete Perl opera. Sono gli stessi argomenti che è possibile richiamare quando si chiama l'interprete perl direttamente dalla riga di comando.

  • -W mostra gli avvisi (ovvero le informazioni di debug).
  • -T Attiva controllo dell'inquinamento/sicurezza.
5

Entrambe -w e -T sono una sorta di bandiere "infallibili".

-w è lo stesso dell'istruzione use warning nel codice ed è equivalente all'opzione di avviso in molti compilatori.Un semplice esempio potrebbe essere un avvertimento sull'utilizzo variabile non inizializzata:

#!/usr/bin/perl -w 
print "$A\n"; 
print "Hello, world!\n"; 

stamperà:

Name "main::A" used only once: possible typo at ./perl-warnings line 3. 
Use of uninitialized value $A in concatenation (.) or string at 
./perl-warnings line 3. 

Hello, world! 

La bandiera -T significa che qualsiasi valore che è venuto dal mondo esterno (come opposto ad essere calcolata all'interno della programma) è considerato una potenziale minaccia e non consente l'uso di tali valori nelle operazioni relative al sistema, come la scrittura di file, l'esecuzione di comandi di sistema, ecc. (Ecco perché Perl attiva la modalità "taint" quando lo script è in esecuzione in setuid/setgid.)

La modalità "contaminata" sta "rafforzando" l'utente per ricontrollare il valore all'interno dello script.

Ad esempio, il codice:

#!/usr/bin/perl -T 
$A = shift; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

produrrà un errore fatale (chiude il programma):

$ ./perl-tainted jkjk 
Insecure dependency in open while running with -T switch at 
./perl-tainted line 3. 

E questo è solo perché il valore dell'argomento è venuto da "fuori" e non è stato " controllato due volte". La modalità "contaminazione" attira la tua attenzione su questo fatto. Naturalmente, è facile ingannarlo, ad esempio

#!/usr/bin/perl -T 
$A = shift; 
$A = $1 if $A =~ /(^.*$)/; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

In questo caso, tutto ha funzionato correttamente. Hai "ingannato" la "modalità taint". Bene, il presupposto è che le intenzioni del programmatore siano di rendere il programma più sicuro, quindi il programmatore non solo aggira l'errore, ma preferisce prendere alcune misure di sicurezza. Uno dei soprannomi di Perl è "la colla e il nastro adesivo degli amministratori di sistema". Non è improbabile che l'amministratore di sistema crei script Perl per le proprie esigenze e lo eseguirà con le autorizzazioni root. Pensa a questo script facendo qualcosa di normale che gli utenti non sono autorizzati a fare ... probabilmente vorrai ricontrollare cose che non fanno parte del programma stesso, e vuoi che Perl ti ricordi di loro.

Spero che aiuti.

+2

'-w' non è lo stesso di' use warnings; '. Il pragma è spiegato lessicalmente. – friedo

+2

su "-w è lo stesso di usare l'avviso". non è esattamente corretto. -W attiva avvisi ovunque (ignorando $^W o nessun avviso), -w attiva gli avvisi ovunque tranne quando $^W è impostato su 0 o nessun avviso viene utilizzato. "use warnings" è in senso lessicale. – tinita

3

sulla modalità Taint (-T):
require e use dichiarazioni cambia quando la modalità macchia è acceso.
Il percorso per caricare librerie/moduli non contiene più . (la directory corrente) dal suo percorso.

Quindi, se si caricano librerie o moduli relativi alla directory di lavoro corrente senza specificare esplicitamente il percorso, lo script si interromperà in modalità contaminazione.

Per esempio: Considerare perl_taint_ex.pl

#!/usr/bin/perl -T 

require "abc.pl"; 
print "Done"; 

fallirebbe come questo

D:\perlex>perl perl_taint_ex.pl 
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl 
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib) 
at perl_taint_ex.pl line 3. 

Così, quando la modalità contaminazione è in, è necessario dire la dichiarazione richiedere esplicitamente dove caricare la libreria dal . viene rimossa durante la modalità di contaminazione dall'array @INC.

@INC contiene un elenco di percorsi validi per la lettura di file e moduli di libreria da.

Se la modalità di contaminazione è attiva, si sarebbe semplicemente effettuare le seguenti operazioni:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl 
Done 

-ID:\perlex includerà directory D:\perlex in @INC.

È possibile provare altri modi per aggiungere il percorso a @INC, questo è solo un esempio.

+0

Questa spiegazione fornisce una buona spiegazione di cosa succede se non si utilizza il parametro -T correttamente dalla riga di comando ma lo si specifica nella riga shebang di uno script perl. Utile. – pdwalker