Jaka jest różnica między uruchomieniem pliku wykonywalnego tylko według nazwy a dodaniem przed nim kropki / ukośnika?

13

To jest wynik ls -allpolecenia:

-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 ... ./jdevDlaczego tak jest?

Maniak
źródło

Odpowiedzi:

20

Kiedy uruchamiasz plik wykonywalny (a raczej w świecie unix / linux - plik z włączonymi prawami / flagą) w następujący sposób:

$ ./jdev

następnie zaznaczasz ., że chcesz uruchomić plik w katalogu roboczym (katalog, w którym aktualnie się znajdujesz), który jest nazwany jdevi ma uprawnienia do wykonywania dla użytkownika, który go uruchamia (musisz pamiętać, że nadal może to być link do inny plik, możesz to sprawdzić, wpisując ls -l jdevterminal)

(zobacz uprawnienia do plików w systemie Linux / Unix )

Gdy uruchomisz go jako

$ jdev

to najprawdopodobniej nie jest jdevzainstalowany gdzieś w systemie i trzeba go $PATH(np /usr/bin/lub /bin/lub /usr/local/bin/)

Jak stwierdził Peter : możesz użyć, whichaby wskazać plik wykonywalny uruchamiany za pomocą określonej komendy, np .:

$ which find
/usr/bin/find
Patryk
źródło
1
Nie oznacza to również, że whichnarzędzie może powiedzieć ci, który plik wykonywalny zostanie użyty, jeśli nie podasz ścieżki.
Peter
@peterph Edytowałem moją odpowiedź.
Patryk
7
O wiele lepiej jest użyć, typeaby sprawdzić, co jest uruchamiane przez określone polecenie. Przyczyna whichpokaże ci tylko plik binarny gdzieś w $ PATH, jednak może być aliasowany do absolutnie innego pliku binarnego.
pędzi
@rush ja właśnie próbowałem tego i to nie pracy będzie jak mówisz: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. Podczas gdyzsoelim -> soelim
Patryk
2
@Patryk Myślę, że pośpiech oznaczał aliasy / funkcje powłoki, które whichnie 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).
Peter
8

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 $PATHzmiennej ś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. zshZezwalają 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 fooznajdującej się w bieżącym katalogu roboczym, musisz wymyślić nazwę zawierającą ukośnik. ./foojest 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 typepolecenia. Nie używaj whichpolecenia, które na ogół nie robi tego, co według ciebie działa, i jest dziedzictwem, z cshktórego lepiej zostawić je w spokoju.

Stéphane Chazelas
źródło
Dlaczego nie „który”, ale „typ”?
Geek
@Geek, tutaj jest FAQ, zobacz unix.stackexchange.com/search?q=[which]+type
Stéphane Chazelas
czy podałeś prawidłowy link?
Geek
To wynik wyszukiwania w tej witrynie, który potwierdza, że ​​jest to często zadawane pytanie. Wiele odpowiedzi na te pytania powie ci, dlaczego nie używać which. Zobacz na przykład unix.stackexchange.com/questions/16693/…
Stéphane Chazelas
2

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:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %
Afsin Toparlak
źródło
1

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. ./jdevjest ścieżką względną, ponieważ .oznacza bieżący katalog (w rzeczywistości ls -all .dałby to samo, co ls -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 $PATHsą 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ś jdevsię uruchomić plik wykonywalny w bieżącym katalogu. Chyba że zmieniłeś $PATHto ., 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 $PATHbył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ż lsjeśli $PATHzacznie się od tego ., wystarczy prosty ls -lahatak do twojego systemu.

njsg
źródło
Twoja terminologia jest myląca. jdevsam jest także ścieżką względną. Zasada jest taka: jeśli nie zawiera ukośnika, to jest sprawdzany w aliasach, funkcjach, a $PATHw 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).
Stéphane Chazelas