To jest wynik ls -all
polecenia:
-rwxr----- 1 subhrcho dba 3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba 1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba 347 Mar 6 2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba 821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba 584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba 4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba 5047 Dec 6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Teraz, kiedy uruchamiam jdev
, działa inna wersja Oracle JDveloper niż kiedy uruchamiam go jako ... ./jdev
Dlaczego tak jest?
which
narzędzie może powiedzieć ci, który plik wykonywalny zostanie użyty, jeśli nie podasz ścieżki.type
aby sprawdzić, co jest uruchamiane przez określone polecenie. Przyczynawhich
pokaże ci tylko plik binarny gdzieś w $ PATH, jednak może być aliasowany do absolutnie innego pliku binarnego.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Podczas gdyzsoelim -> soelim
which
nie mają szans na znalezienie, ponieważ jest to samodzielny plik binarny, który nie ma dostępu do działającego środowiska powłoki (przez to rozumiem aliasy i funkcje, a nie tylko zmienne środowiskowe , niektóre z nich są dziedziczone).Jeśli wywołujesz polecenie bez powłoki w nazwie w powłoce, to jest ono wyszukiwane w aliasach powłoki, funkcjach i na liście ścieżek podanych w
$PATH
zmiennej środowiskowej. (zwróć uwagę, że możesz mieć bieżący katalog roboczy (określony jako.
lub pusty ciąg) lub dowolny katalog względny$PATH
, ale nie jest to zalecane ze względów bezpieczeństwa).Jeśli w nazwie znajduje się ukośnik, to tak się nie dzieje, nazwa jest traktowana jako ścieżka do wykonania polecenia (chociaż niektóre powłoki, takie jak np.
zsh
Zezwalają na to, że aliasy lub funkcje mają w nazwie ukośniki, które miałyby pierwszeństwo).Jeśli więc chcesz uruchomić polecenie o nazwie
foo
znajdującej się w bieżącym katalogu roboczym, musisz wymyślić nazwę zawierającą ukośnik../foo
jest najbardziej oczywiste. Możesz także użyć pełnej ścieżki lub../dir/foo
...Aby wiedzieć, co by działała powłoka, użyj
type
polecenia. Nie używajwhich
polecenia, które na ogół nie robi tego, co według ciebie działa, i jest dziedzictwem, zcsh
którego lepiej zostawić je w spokoju.źródło
which
. Zobacz na przykład unix.stackexchange.com/questions/16693/…Polecam użyć wbudowanego Zsha „gdzie” (lepiej niż „który”), aby zobaczyć, w jaki sposób i w jakiej kolejności zostaną znalezione aliasy, wbudowane powłoki lub cokolwiek innego, aby uzyskać $ PATH ;-)
Oto przykład lepszego zrozumienia rzeczy, w jaki sposób jest wybierany:
źródło
Chociaż prawdopodobnie zależy to od powłoki, reguła zwykle brzmi:
Jeśli podasz ścieżkę względną lub bezwzględną, zostanie ona użyta.
./jdev
jest ścieżką względną, ponieważ.
oznacza bieżący katalog (w rzeczywistościls -all .
dałby to samo, cols -all
). Jeśli tak/usr/bin/tool/
, korzystasz ze ścieżki bezwzględnej. W takich przypadkach wskazany plik jest wykonywany.Jeśli nie podasz ścieżki, a jedynie nazwę, katalogi w
$PATH
są wyszukiwane w poszukiwaniu narzędzia, które próbujesz uruchomić.Jeśli masz plik w bieżącym katalogu o tej samej nazwie co plik w niektórych katalogach w
$PATH
, i uruchamiasz go, przygotowując się./
do jego nazwy, skutecznie uruchomisz inny plik.Być może innym problemem jest to, że spodziewałeś
jdev
się uruchomić plik wykonywalny w bieżącym katalogu. Chyba że zmieniłeś$PATH
to.
, to nie jest coś, czego powinieneś się spodziewać ...... i nadal nie jest to dobry pomysł, aby to
.
tam umieścić , jeśli to zrobisz, proszę przynajmniej umieścić go na końcu, aby reszta$PATH
była zawsze przeszukiwana jako pierwsza - wyobraź sobie, że jesteś we wspólnym katalogu sieciowym i ktoś decyduje się na umieszczenie tam złego pliku binarnego, ponieważls
jeśli$PATH
zacznie się od tego.
, wystarczy prostyls -lah
atak do twojego systemu.źródło
jdev
sam jest także ścieżką względną. Zasada jest taka: jeśli nie zawiera ukośnika, to jest sprawdzany w aliasach, funkcjach, a$PATH
w przeciwnym razie jest sprawdzany bezpośrednio w systemie plików (chociaż niektóre powłoki zezwalają na aliasy lub funkcje z / w nazwie, które wtedy biorą pierwszeństwo).