dlaczego ./ jest potrzebny do uruchomienia pliku uruchamialnego?

9

Używam Ubuntu i zauważam, że wiele moich skryptów, które można uruchomić, nie uruchomi się, dopóki nie poprzedzę tematu ./.

Na przykład, jeśli mam skrypt perla: /home/me/script.pli jestem obecnie w trakcie /home/mepisania script.pl, nie zrobi tego, ale ./script.plzrobi to.

Dlaczego?

David B.
źródło
@David B: runnable file => executable file?
Lazer,

Odpowiedzi:

13

Aby wykonać skrypt, musisz wpisać pełną ścieżkę do skryptu, chyba że skrypt jest obecny w jednym z katalogów wymienionych w $PATHzmiennej środowiskowej. Generalnie (i domyślnie) .(bieżący katalog) nie ma w twoim $PATH, więc musisz go wpisać, ./scriptaby go wykonać.

mipadi
źródło
21

Ponieważ bieżący katalog nie znajduje się na twojej ścieżce. To jest zabezpieczenie. Gdyby było na twojej drodze, ktoś mógłby potencjalnie upuścić złośliwą kopię zwykłego polecenia, a gdy jesteś w tym katalogu zamiast na przykład prawdziwego sudo, uruchomiłbyś fałszywy. To byłoby złe.

Matt Greer
źródło
3
Jest to nieco mylące. Tak długo, jak .były potem /usr/bin/, nie zastąpiłoby to prawdziwego sudo. Ma to na celu zapewnienie, że przypadkowo nie dodasz programów do ścieżki, ale nie chodzi przede wszystkim o zastąpienie istniejących.
Matthew Flaschen
Zamiast tego sudoużyłbym lsi rm. O wiele bardziej prawdopodobne jest wezwanie.
Aaron Digulla,
@aaron: na pewno, ale lsnie poprosi o hasło, a jeśli użytkownik może użyć sudohasła, jest interesujące ...;)
laurent
1
@Mateusz. Tak, nadal jest to trudne do wykorzystania, ale realne zagrożenie bezpieczeństwa. Powiedzmy, że wstawiłem skrypt, slktóry robi złe rzeczy, a następnie wywołuje ls, a następnie sam się usuwa. Nie można zastąpić narzędzi systemowych, ale można „typosquat”
Rich Homolka
@laurent: Co miałem na myśli to: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Nie musisz znać hasła.
Aaron Digulla,
4
echo $PATH

Musisz mieć bieżący katalog (pojedynczą kropkę) na swojej ścieżce, aby to zadziałało.

Możesz dodać go do swojej ścieżki, jeśli chcesz za pomocą następujących poleceń.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


źródło
3

powłoka szuka ścieżki do plików wykonywalnych i domyślnie ./nie ma jej na ścieżce.

Emyr
źródło