Dlaczego używamy ./filenamedo uruchamiania pliku w systemie Linux?
Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc, lsetc ...
Dlaczego używamy ./filenamedo uruchamiania pliku w systemie Linux?
Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc, lsetc ...
Odpowiedzi:
W systemie Linux, UNIX i pokrewnych systemach operacyjnych .oznacza bieżący katalog. Ponieważ chcesz uruchomić plik w bieżącym katalogu, a tego katalogu nie ma w twoim $PATH, potrzebujesz ./bitu, aby powiedzieć powłoce, gdzie znajduje się plik wykonywalny. ./fooOznacza to , że uruchom plik wykonywalny o nazwie, fooktóra znajduje się w tym katalogu.
Możesz użyć typelub, whichaby uzyskać pełną ścieżkę wszelkich poleceń znalezionych w twoim $PATH.
aliases, które mogą przeszkadzać, nie tylko $PATH.
.pierwszej kolejności, byłby to problem z bezpieczeństwem, ty lub ktoś inny mógłbyś lsna przykład zastąpić (prosty wirus / trojen: stwórz plik zip z nazwą pliku wykonywalnego ls, gdy ktoś przeszukuje , uruchamiają ten plik wykonywalny, który…). Jeśli szukał w .ostatnim, możesz długo zwariować, nie wiedząc, dlaczego twój program nie działa (np. Tworzysz program o nazwie test, zamiast uruchamiać program, uruchamia program testowy systemu.
export PATH="$PATH:."aby wykonać polecenie w bieżącym katalogu, jeśli nie można go znaleźć gdzie indziej w ŚCIEŻCE, możesz to dodać w pliku .bashrc
Dosłowna odpowiedź jest taka, jak inni podali: ponieważ bieżącego katalogu nie ma w twoim $PATH.
Ale dlaczego? Krótko mówiąc, to dla bezpieczeństwa. Jeśli szukasz w czyimś katalogu domowym (lub / tmp) i piszesz po prostu gcclub ls, chcesz wiedzieć, że prowadzisz prawdziwą, a nie złośliwą wersję, którą napisał twój przyjaciel dowcipnisia, który usuwa wszystkie twoje pliki. Innym przykładem może być testlub [, który może zastąpić te polecenia w skryptach powłoki, jeśli twoja powłoka nie ma ich jako wbudowanych.
Posiadanie .jako ostatniego wpisu na twojej ścieżce jest nieco bezpieczniejsze, ale istnieją inne ataki, które wykorzystują to. Łatwo jest wykorzystać typowe literówki, takie jak sllub ls-l. Lub znajdź typowe polecenie, które nie jest instalowane w tym systemie - vimna przykład, ponieważ sysadmini mają ponadprzeciętne prawdopodobieństwo, że je wpisze.
PATHzmiennej środowiskowej.
Jeśli masz na myśli, dlaczego potrzebujesz ./ na początku - to dlatego, że (w przeciwieństwie do systemu Windows) bieżący katalog nie jest domyślnie częścią twojej ścieżki. Jeśli uruchomisz:
$ ls
twoja powłoka szuka lsw katalogach w zmiennej środowiskowej PATH ( echo $PATHaby ją zobaczyć) i uruchamia pierwszy plik wykonywalny o nazwie, lsktóry znajdzie. Jeśli wpiszesz:
$ a.out
powłoka zrobi to samo - ale prawdopodobnie nie znajdzie pliku wykonywalnego o nazwie a.out. Musisz powiedzieć powłoce, gdzie jest a.out - jest w bieżącym katalogu (.), A następnie ścieżka ./a.out.
Jeśli pytasz, dlaczego nazywa się to „a.out”, jest to tylko domyślna nazwa pliku wyjściowego dla gcc. Możesz to zmienić za pomocą argumentu -o arg. Na przykład:
$ gcc test.c -o test
$ ./test
touch .a.out; ls -lAto zobaczyć.)
<dir>/<file>więc w zasadzie mówisz o wykonaniu pliku w bieżącym katalogu, na co wskazuje./test
Możesz spróbować dodać :.do zmiennej $ PATH.
Spróbuj ALT + F2 i wpisz: gksudo gedit /etc/environmentjeśli używasz Linux / GTK (to właśnie masz, jeśli używasz Ubuntu).
JEDNAK, zdecydowanie odradzam to robić. Jest źle źle źle i źle.
Wiesz, tego rodzaju rzeczy działają tak od 1970 roku. Istnieje powód, dla którego bieżący katalog nie jest uwzględniony w $ PATH.
. jest bieżącym katalogiem
.somethingbyłby ukrytym plikiem (wpisz „ALT +”, aby pojawiały się w Nautilusie, lub spróbuj „ ls -la”.
./someProgram.sh to, co wpiszesz, aby URUCHOMIĆ plik wykonywalny someProgram.sh w bieżącym katalogu.
.somethingElse oznaczałoby to, że masz ukryty plik wykonywalny w bieżącym katalogu, co jest złym pomysłem.
./command_namedo wykonywania polecenia w systemie Linux”?