Użyłem go pod numerem #!/usr/bin/perl
, ale nie znalazłem zadowalającej odpowiedzi. Wiem, że to dość podstawowa rzecz, ale czy mogę wyjaśnić, jakie jest znaczenie Perl? Co ponadto oznacza -w
lub -T
w ? Jestem początkującym perłem, więc proszę o cierpliwość.Jakie jest znaczenie opcji -T lub -w w #!/Usr/bin/perl?
Odpowiedz
#! jest powszechnie nazywane "shebang" i informuje komputer, jak uruchomić skrypt. Zobaczysz także wiele skryptów powłoki z #!/bin/sh
lub #!/bin/bash
.
Tak więc, /usr/bin/perl
to Twój interpreter Perla, który jest uruchamiany i otrzymuje plik do wykonania.
Reszta wiersza to opcje dla Perla. "-T" is tainting (oznacza to, że dane wejściowe są oznaczone jako "niezaufane", dopóki nie sprawdzisz ich formatu). "-w" włącza ostrzeżenia.
Możesz dowiedzieć się więcej, uruchamiając perldoc perlrun (perldoc to czytnik dokumentacji Perla, może być zainstalowany, może być w swoim pakiecie).
Dla skryptów piszesz Polecam zaczynając je:
#!/usr/bin/perl
use warnings;
use strict;
Włącza wielu ostrzeżeń i dodatkowych kontroli - szczególnie przydatne podczas uczenia się (wciąż się uczę i używam Perl od ponad 10 lat).
Oto zapytanie. Kiedy wymagam innego pliku .pl do pliku posiadającego #!/Usr/bin/perl -T, generuje on błąd. A kiedy usuwam -T, działa. Co jest przyczyną? Dzięki. – vijay
To się nazywa shebang. W systemach opartych na Uniksie (OSX, Linux, itp.) Linia ta wskazuje ścieżkę do interpretera języka, gdy skrypt uruchamiany jest z wiersza poleceń. W przypadku perl/usr/bin/perl jest to ścieżka do interpretera perl. Jeśli hashbang zostanie pominięty, systemy * nix nie będą wiedziały, jak przeanalizować skrypt, gdy zostanie wywołany jako plik wykonywalny. Zamiast tego spróbuje zinterpretować skrypt w dowolnej powłoce uruchomionej przez użytkownika (prawdopodobnie bash) i przerwać skrypt.
http://en.wikipedia.org/wiki/Hashbang
-W i -T są argumenty, że Controll drogę interpreter perla działa. Są to te same argumenty, które można wywołać podczas wywoływania interpretera perla bezpośrednio z wiersza poleceń.
- -W wyświetla ostrzeżenia (również informacje dotyczące debugowania).
- -T włącza sprawdzanie zabrudzenia/bezpieczeństwa.
Zarówno -w
, jak i -T
są rodzajem "niezawodnych" flag.
-w
jest tym samym, co use warning
w swoim kodzie, i jest odpowiednikiem opcji ostrzegania w wielu kompilatorach.Najprostszym przykładem może być ostrzeżenie o użyciu niezainicjowanej zmiennej:
#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";
wypisze:
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!
-T
flaga oznacza, że każda wartość, która pochodzi od świata zewnętrznego (jako przeciwieństwo do oblicza wewnątrz program) jest uważane za potencjalne zagrożenie i uniemożliwia użycie takich wartości w operacjach związanych z systemem, takich jak zapisywanie plików, wykonywanie poleceń systemowych itp. (Dlatego właśnie Perl aktywowałby tryb "taint", gdy skrypt działa pod ustawieniem setuid/setgid.)
Tryb "skażony" polega na "wymuszeniu" podwójnego sprawdzenia wartości w skrypcie.
Eg, kod:
#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;
będzie produkować błąd krytyczny (zakończenie programu):
$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.
I to tylko dlatego, że wartość argumentu pochodziła z „zewnątrz” i nie było " dwukrotnie sprawdzony ". Tryb "taint" zwraca twoją uwagę na ten fakt. Oczywiście łatwo go oszukać, np .:
#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;
W tym przypadku wszystko działało dobrze. Oszukujesz "tryb skażenia". Założeniem jest, że intencją programisty jest uczynienie programu bezpieczniejszym, aby programista nie popracował nad błędem, ale wolałby podjąć pewne środki bezpieczeństwa. Jednym z pseudonimów Perla jest "klej i taśma klejąca dla administratorów systemu". Jest mało prawdopodobne, że administrator systemu utworzyłby skrypt Perla dla własnych potrzeb i uruchomiłby go z uprawnieniami root
. Pomyśl o tym scenariuszu, robiąc coś, czego zwykli użytkownicy nie mogą robić ... prawdopodobnie chcesz dokładnie sprawdzić rzeczy, które nie są częścią samego programu, i chcesz, aby Perl przypomniał Ci o nich.
Mam nadzieję, że to pomaga.
'-w' to nie to samo, co' use warning; '. Pragma ma zasięg leksykalny. – friedo
o "-w to to samo co ostrzeżenie użycia". to nie jest dokładnie poprawne. -W włącza ostrzeżenia w dowolnym miejscu (ignorując $^W lub bez ostrzeżeń), -w włącza ostrzeżenia w dowolnym miejscu z wyjątkiem sytuacji, gdy $^W jest ustawione na 0 lub nie są używane żadne ostrzeżenia. "use warning" ma charakter leksykalny. – tinita
o skaza trybie (-T):
require
i use
wypowiedzi zmienia się, gdy tryb skaza jest włączony.
Ścieżka do ładowania bibliotek/modułów nie zawiera już ścieżki .
(bieżącego katalogu).
Jeśli więc załadujesz biblioteki lub moduły w odniesieniu do bieżącego katalogu roboczego bez jawnego określenia ścieżki, skrypt zostanie przerwany w trybie taint.
Dla ex: Rozważmy perl_taint_ex.pl
#!/usr/bin/perl -T
require "abc.pl";
print "Done";
zawiedzie się ten
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.
Więc kiedy tryb skaza jest na, trzeba powiedzieć wyraźnie, gdzie oświadczenie wymaga załadowania biblioteka od .
została usunięta podczas trybu taint z tablicy @INC
.
@INC
zawiera listę prawidłowych ścieżek do odczytywania plików i modułów biblioteki.
Jeśli tryb skaza jest, byś po prostu wykonaj następujące czynności:
D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl
Done
-ID:\perlex
obejmie katalogu D:\perlex
w @INC
.
Możesz wypróbować inne sposoby dodawania ścieżki do @INC
, to tylko jeden przykład.
To wyjaśnienie dostarcza dobrego wyjaśnienia tego, co się stanie, jeśli nie użyjesz poprawnie parametru -T z wiersza poleceń, ale podasz go w wierszu shebang skryptu perl. Przydatny. – pdwalker
- 1. Jakie jest znaczenie t = "shared" w elemencie formuły?
- 2. Jakie jest znaczenie znaku "&" w zwróconej wartości?
- 3. Jakie jest znaczenie CTOR?
- 4. Jakie jest znaczenie operatora || =
- 5. Jakie jest znaczenie System.CLSCompliantAttribute?
- 6. Jakie jest znaczenie operatora &?
- 7. Jakie jest znaczenie transakcji?
- 8. Jakie jest znaczenie! #: 3?
- 9. Jakie jest znaczenie identyfikatora?
- 10. jakie jest znaczenie CV_INSTRUMENT_REGION()?
- 11. Jakie jest znaczenie WaitUntilDOne w performSelectorOnMainThread?
- 12. Jakie jest znaczenie podwójnego "at" (@@) w Perlu?
- 13. Jakie jest znaczenie wyrażenia "+ + a"?
- 14. jakie jest znaczenie numeru 1e5?
- 15. Jakie jest znaczenie adnotacji @ javax.persistence.Lob w WZP?
- 16. Jakie jest znaczenie "@include" w plikach .css?
- 17. Jakie jest znaczenie? = W operatorze ABAP?
- 18. Jakie jest znaczenie symbolu $ w jQuery?
- 19. Jakie jest znaczenie <- w AI?
- 20. Jakie jest znaczenie $ {0%/*} w skrypcie bash?
- 21. jakie jest znaczenie nawiasów w definicji właściwości?
- 22. Jakie jest znaczenie DPI w BitmapSource.Create() metoda?
- 23. Jakie jest znaczenie IMetadataExchange w WCF?
- 24. Jakie jest znaczenie SQL 0x5E5B7D7E?
- 25. Jakie jest znaczenie tego użycia generycznych Java?
- 26. Jakie jest znaczenie tego typedef?
- 27. Jakie jest znaczenie umieszczenia klauzuli "forSome" w składni generycznej Scala?
- 28. Jakie jest znaczenie removeCallbacks (Runnable r) w Handler w Androidzie
- 29. Jakie jest znaczenie terminu "klasa niestandardowa"?
- 30. Jakie jest znaczenie i użycie __stdcall?
'#!/Usr/bin/perl' nazywa się linią shebang. '-w" dla ostrzeżeń "-T" dla trybu Taint. –
'-w' nie było zalecane od wielu lat. Od wersji Perl 5.6.0 mieliśmy "używać ostrzeżeń", które są bardziej wydajne i bardziej elastyczne. –