Dlaczego używamy ./filename
do uruchamiania pliku w systemie Linux?
Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc
, ls
etc ...
command-line
executable
Renjith G.
źródło
źródło
./command_name
do wykonywania polecenia w systemie Linux”?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
.źródło
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 wykonywalnegols
, 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 .bashrcDosł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
lubls
, 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 jaksl
lubls-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.źródło
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:
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: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:
źródło
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.źródło