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?
risposta
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).
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
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.
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.
'-w' non è lo stesso di' use warnings; '. Il pragma è spiegato lessicalmente. – friedo
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
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.
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
- 1. Qual è il significato di ∃?
- 2. Qual è il significato di "==" in C?
- 3. Qual è il significato di "_" in python?
- 4. Qual è il significato di [...] in python?
- 5. Qual è il significato di @_ in Perl?
- 6. Qual è il significato di `_t` di` size_t` in C?
- 7. Qual è il significato dell'operatore || =
- 8. Qual è il significato di CTOR?
- 9. Qual è il significato dell'operatore &?
- 10. Qual è il significato di -532459699?
- 11. Qual è il significato di "Unità eroe"?
- 12. Qual è il significato di <#= #>
- 13. Qual è il significato SQL di 0x5E5B7D7E?
- 14. Qual è il significato dell'impostazione "Pluralizza o singolarizza l'oggetto generato"?
- 15. Qual è il significato di svg: svg?
- 16. Qual è il significato di main_syntax
- 17. Qual è il significato di questo typedef?
- 18. Qual è il significato di questa sintassi?
- 19. Qual è il significato di id?
- 20. Qual è il significato di [...] regex?
- 21. qual è il significato di "this.this $ 0"?
- 22. Qual è il significato di System.CLSCompliantAttribute?
- 23. Qual è il significato di 'sourceSets.all *'
- 24. Qual è il significato di! #: 3?
- 25. Qual è il significato dello specificatore di formattazione% m?
- 26. Qual è il significato dei file dylib?
- 27. Qual è il significato di [^] in espressioni regolari di Javascript?
- 28. Qual è il significato di -2 in questa istruzione IL?
- 29. qual è il significato del numero 1e5?
- 30. Qual è il significato dell'espressione "+ + a"?
'#!/Usr/bin/perl' si chiama linea shebang. '-w' per gli avvisi. -T' per la modalità Taint. –
'-w' non è stato raccomandato per molti anni. Dal Perl 5.6.0 abbiamo avuto 'use warnings', che è più potente e più flessibile. –