Jaka jest różnica między nazwą pliku a ./nazwa pliku w systemie Linux

10

Jaka jest różnica między filenamei ./filename? W jakich okolicznościach jedna jest preferowana względem drugiej?

justintime
źródło

Odpowiedzi:

18

W przypadku plików danych nie robi to różnicy - obie instrukcje będą odwoływać się do pliku danych w bieżącym katalogu. (Na przykład cat filenamei cat ./filenamesą semantycznie identyczne.)

To inna historia, jeśli nazwa pliku odnosi się do pliku wykonywalnego , tj. Jest pierwszą (lub nawet jedyną) rzeczą, którą wpisujesz w wierszu poleceń. ./filenameszuka pliku wykonywalnego w bieżącym katalogu i nigdzie indziej. filename, z drugiej strony, oceni zmienną środowiskową PATHi poszuka filenamew każdym katalogu w niej przechowywanym (który może, ale nie musi zawierać bieżący katalog).

./filename(lub dowolny inny /path/to/filename) jest zatem preferowany, gdy chcesz wykonać określony plik wykonywalny, a nie pierwszy znaleziony w ŚCIEŻCE.

DevSolar
źródło
6

Jeśli uruchamiasz program, filenamemówi o uruchomieniu pierwszego z nich, $PATHa drugi mówi o uruchomieniu tego z bieżącego katalogu.

Jeśli używasz tego pliku jako argument do programu jak w do_something filenamelub do_something ./filenamewtedy one oznaczają to samo.

Wstrzymano do odwołania.
źródło
5

Masz na myśli wykonywanie poleceń, prawda?

Istnieje zmienna środowiskowa, PATHktóra zawiera niektóre katalogi systemowe, oddzielone średnikiem. Po wpisaniu commandsystem szuka w tych katalogach kolejności, w jakiej są one określone, aby znaleźć plik wykonywalny o nazwie <polecenie> Jeśli go znajdzie, próbuje go wykonać. Możesz zobaczyć swoją ŚCIEŻKĘ echo $PATHw trybie bash. Na przykład:

$ echo $ PATH
/ sbin: / bin: / usr / sbin: / usr / bin: / usr / games: / usr / local / sbin: / usr / local / bin: / home / ivanatora / bin: / usr / local / kde4 / bin: / usr / local / kde4 / bin

Podczas pisania ./filenamepodajesz dokładną ścieżkę: bieżący katalog. Możesz zobaczyć, że bieżący katalog rzadko znajduje się w twojej $ PATH (ze względów bezpieczeństwa). Więc jeśli chcesz wykonać plik z bieżącego katalogu, użyj ./filename.

Aby wykonać plik według jego ścieżki (szczególnie jeśli nie ma go w $ PATH), możesz także wpisać <path>/file:

/ sbin / ifconfig

Ivan Petrushev
źródło
3

Zabezpieczenia wykonywalne są głównym powodem tej różnicy.

Nie chcesz . (obecny katalog roboczy lub PWD) na twojej ścieżce, ponieważ ktoś może trojana http://en.wikipedia.org/wiki/Trojan_horse_%28computing%29 kluczowego pliku wykonywalnego, takiego jak ps lub ls, w twoim PWD i oszukać cię, prezentując złe dane.

bitbucket
źródło
1

To zależy, w jakich okolicznościach go użyjesz.

Jako argument, np. „Nazwa pliku programu”, to zależy od programu, ale ogólnie są one identyczne.

Jako nazwa programu, np. „Argumenty nazwy pliku”, następnie „argumenty nazwy pliku” przeszukuje ścieżkę PATH w celu znalezienia pliku binarnego, a „argumenty nazwy pliku .//” użyją programu w bieżącym katalogu. Jest to oczywiście przydatne, jeśli. nie znajduje się w ŚCIEŻCE, ale warto go również użyć, nawet jeśli. znajduje się na ścieżce, być może dlatego, że pasuje do wcześniejszego wpisu.

goryl
źródło