Dlaczego używamy „./” do wykonania pliku?


84

Dlaczego używamy ./filenamedo uruchamiania pliku w systemie Linux?

Dlaczego nie wystarczy wprowadzić go jak innych poleceń gcc, lsetc ...


Czy pierwszy wiersz nie byłby lepiej napisany jako „Dlaczego używamy ./command_namedo wykonywania polecenia w systemie Linux”?

Odpowiedzi:


78

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.


5
Wykonywanie programów w bieżącym katalogu jest bardzo powszechne. Dlaczego powłoka również tam nie szuka? Najpierw wyszukuje w., A następnie w $ PATH.
Michael

są też aliases, które mogą przeszkadzać, nie tylko $PATH.
user2485710,

18
@Michael bezpieczeństwo i zdrowie psychiczne: Jeśli wyszukiwałby w .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.
ctrl-alt-delor

Zapewnia również, że jeśli aplikacja lub skrypt pojawia się wiele razy na ścieżce, że wykonujesz wersję, którą zamierzasz uruchomić (tę właśnie tutaj, w katalogu „.”).
Jim2B,

Możesz wykonać, 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
jcubic

99

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.


5
Praktyczny przykład kogoś, kto zostanie przez to ugryziony
mattdm

Wystarczy mieć ścieżki bezwzględne w PATHzmiennej środowiskowej.
Ed Heal

45

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

Dzięki. Mam wątpliwości, dlaczego potrzebujesz ./ na początku… Mam użycie „.” (poit bieżący katalog), ale po co „/”?
Renjith G

8
/ jest separatorem ścieżek w Linuksie, więc używasz go do oddzielenia katalogu (.) od nazwy pliku (a.out). Bez niego masz .a.out, który sam w sobie jest prawidłową nazwą pliku. (Spróbuj touch .a.out; ls -lAto zobaczyć.)
Simon Whitaker

5
w ten sposób określasz ścieżkę w Uniksie, <dir>/<file>więc w zasadzie mówisz o wykonaniu pliku w bieżącym katalogu, na co wskazuje./test
Rohan Monga

Red Hat Linux release 9 (Shrike) Kernel 2.4.20-8 na i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -l Łącznie 3 -rw-rw-r-- 1 renjithg renjithg 0 lis 30 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 listopada 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 sierpnia 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9? Czas na aktualizację!
mattdm

4

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.