Dlaczego używamy ./filename
do uruchamiania pliku w systemie Linux?
Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc
, ls
etc ...
Dlaczego używamy ./filename
do uruchamiania pliku w systemie Linux?
Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc
, ls
etc ...
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. ./foo
Oznacza to , że uruchom plik wykonywalny o nazwie, foo
która znajduje się w tym katalogu.
Możesz użyć type
lub, which
aby uzyskać pełną ścieżkę wszelkich poleceń znalezionych w twoim $PATH
.
alias
es, które mogą przeszkadzać, nie tylko $PATH
.
.
pierwszej kolejności, byłby to problem z bezpieczeństwem, ty lub ktoś inny mógłbyś ls
na 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 gcc
lub 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ć test
lub [
, 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 sl
lub ls-l
. Lub znajdź typowe polecenie, które nie jest instalowane w tym systemie - vim
na przykład, ponieważ sysadmini mają ponadprzeciętne prawdopodobieństwo, że je wpisze.
PATH
zmiennej ś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 ls
w katalogach w zmiennej środowiskowej PATH ( echo $PATH
aby ją zobaczyć) i uruchamia pierwszy plik wykonywalny o nazwie, ls
któ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 -lA
to 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/environment
jeś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
.something
był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_name
do wykonywania polecenia w systemie Linux”?