Это вывод ls -all
команды:
-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
Теперь, когда я просто запускаю, jdev
он запускает другую версию Oracle JDveloper, чем когда я запускаю его как .. ./jdev
Почему это так?
which
утилита может сказать вам, какой исполняемый файл будет использоваться, если путь не указан.type
чтобы проверить, что запускается определенной командой. Causewhich
покажет вам просто двоичный файл где-то в $ PATH, однако он может быть связан с абсолютно другим двоичным файлом.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Покаzsoelim -> soelim
which
не имеет возможности найти, поскольку это автономный двоичный файл, не имеющий доступа к работающей среде оболочки (под которой я имею в виду псевдонимы и функции, а не только переменные среды). некоторые из которых передаются по наследству).Если вы вызываете команду без косой черты в ее имени в оболочке, она ищется в псевдонимах оболочки, функциях и в списке путей, предоставленных в
$PATH
переменной среды. (обратите внимание, что у вас может быть текущий рабочий каталог (указанный как.
или пустая строка) или любой относительный каталог$PATH
, но это не рекомендуется по соображениям безопасности).Если в имени есть косая черта, то этого не происходит, имя берется как путь для выполнения команды (хотя некоторые оболочки, например,
zsh
позволяют псевдонимам или функциям иметь косую черту в имени, которая затем будет иметь приоритет).Итак, если вы хотите запустить команду с именем,
foo
которая находится в текущем рабочем каталоге, вам нужно придумать имя, которое содержит косую черту../foo
является наиболее очевидным. Вы также можете использовать полный путь, или../dir/foo
...Чтобы узнать, какая оболочка будет работать, используйте
type
команду. Не используйтеwhich
команду, которая обычно не делает то, что, как вы думаете, она делает, и является наследием, отcsh
которого лучше оставить в покое.источник
which
. См., Например, unix.stackexchange.com/questions/16693/…Я рекомендую использовать встроенную в Zsh 'where' (лучше, чем 'which'), чтобы увидеть, как и в каком порядке будут найдены псевдонимы, встроенные оболочки или что-то еще для $ PATH ;-)
Вот пример, чтобы лучше понять вещи, как они выбраны:
источник
Хотя это, вероятно, зависит от вашей оболочки, правило обычно таково:
Если вы указываете путь, относительный или абсолютный, этот путь используется.
./jdev
является относительным путем, потому что.
обозначает текущий каталог (на самом деле,ls -all .
даст вам так же, какls -all
). Если вы делаете/usr/bin/tool/
, вы используете абсолютный путь. В этих случаях исполняемый файл указывается.Если вы не указали путь, а просто имя, в каталогах
$PATH
ищется инструмент, который вы пытаетесь запустить.Если у вас есть файл в текущем каталоге с тем же именем, что и файл в некоторых каталогах
$PATH
, и вы запускаете его, добавляя./
к его имени, вы фактически запустите другой файл.Возможно, другая проблема в том, что вы ожидали
jdev
запустить исполняемый файл в текущем каталоге. Если вы не изменили,$PATH
чтобы включить.
, это не то, что вы должны ожидать вообще ...... и это все же не очень хорошая идея, чтобы включить
.
туда, если вы сделаете это, пожалуйста, по крайней мере, поставьте его в конце, так что остальная часть$PATH
всегда ищется первой - просто представьте, что вы находитесь в общей сетевой директории и кто-то решает поместить туда злой бинарный файл, так какls
, если начать$PATH
с.
, простогоls -lah
будет достаточно, чтобы атаковать вашу систему.источник
jdev
один также относительный путь. Правило таково: если он не содержит косую черту, то он ищется в псевдонимах, функциях и$PATH
, в противном случае, он просматривается непосредственно в файловой системе (хотя некоторые оболочки допускают псевдонимы или функции с / в своем имени, которые затем принимают precendence).