«Whereis» и «which» возвращают разные пути в Mac OS X

27

У меня есть OpenSSL 9.8 по умолчанию (Mac OS X 10.6.8) и я решил установить самую новую версию (1.0.1) через MacPorts ( sudo port install openssl).

Это консольный вывод которых и WhereIs команды:

$ whereis openssl
/usr/bin/openssl

(это система по умолчанию)

$which openssl
/opt/local/bin/openssl

(устанавливается через MacPorts)

$ openssl version
OpenSSL 1.0.1c 10 May 2012

(есть версия Mac порта в PATH)

Почему для whereisи возвращаются разные пути which, и это нормально? Есть ли способ получить равные результаты?

jctim
источник

Ответы:

31

В справочной странице whereis, это ясно говорит (выделение мое):

Утилита whereis проверяет стандартные двоичные каталоги на наличие указанных программ, распечатывая пути для любых найденных программ.

Поиск пути - это строка, возвращаемая утилитой sysctl (8) для строки `` user.cs_path ''

В противоположность этому, whichэто инструмент, который обычно используется, чтобы проверить, где двоичный файл для пути вашего пользователя.

Утилита which берет список имен команд и ищет путь для каждого исполняемого файла, который будет запущен, если эти команды действительно будут вызваны .

Это объясняет вашу разницу, поскольку /opt/local/binэто не общесистемный «стандартный» путь - в конце концов, MacPorts - это совершенно необязательный вариант установки, и он sysctlимеет только /usr/bin:/bin:/usr/sbin:/sbinего user.cs_pathпо умолчанию.

В общем, придерживайтесь whichили, which -aчтобы найти двоичный файл, а не использовать whereis.


Вы можете теоретически изменить user.cs_pathчерез

sysctl -w user.cs_path=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

но я не знаю, так ли это хорошая идея.

slhck
источник
Спасибо, вы подчеркнули, что «утилита whereis проверяет стандартные двоичные каталоги » - вот ответ! не смог проголосовать за ваш ответ из-за маленькой репутации ((
jctim
Не волнуйтесь, вы наверняка скоро получите больше репутации. Добро пожаловать в Супер пользователя! :)
slhck
Та же проблема с psql на OS X - к сожалению user.cs_path не доступен для записи. Приближаясь к моему решению, спасибо за такой полезный ответ!
user208769