Shell - Как найти каталог какой-либо команды?

Я знаю, что когда вы находитесь в оболочке, единственными командами, которые могут быть использованы, являются те, которые можно найти в каком-то каталоге, установленном в PATH. Даже я не знаю, как посмотреть, что происходит на моей переменной PATH (и это еще один хороший вопрос, на который можно ответить), что я хотел бы знать:

Я прихожу к оболочке и пишу:

$ lshw

Я хочу знать команду на оболочке, которая может сказать мне, где эта команда находится. Другими словами, где находится этот "исполняемый файл"?

Что-то вроде:

$ location lshw
/usr/bin

Кто-нибудь?

Ответ 1

Если вы используете Bash или zsh, используйте это:

type -a lshw

Это покажет, является ли цель встроенным, функцией, псевдонимом или внешним исполняемым файлом. Если последний, он покажет каждое место в вашем PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

В Bash для функций type -a также будет отображаться определение функции. Вы можете использовать declare -f functionname для выполнения того же самого (вы должны использовать это для zsh, так как type -a нет).

Ответ 2

Вот так:

which lshw

Чтобы увидеть все команды, соответствующие вашему пути:

which -a lshw 

Ответ 3

PATH - это переменная среды и может отображаться с помощью команды echo:

echo $PATH

Это список путей, разделенных символом двоеточия ':'

Команда which сообщает, какой файл запускается при запуске команды:

which lshw

иногда то, что вы получаете, - это путь к символической ссылке; если вы хотите отследить эту ссылку до того, где живет фактический исполняемый файл, вы можете использовать readlink и передать ему вывод which:

readlink -f $(which lshw)

Параметр -f указывает readlink продолжать рекурсивно следовать символической ссылке.

Вот пример с моей машины:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh

Ответ 4

~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz

Ответ 5

В оболочке TENEX C, tcsh, можно перечислить расположение команд или, если это встроенная команда, с помощью команды where, например:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd

Ответ 6

Оболочка Korn ksh предлагает встроенный whence, который идентифицирует другие встроенные встроенные оболочки, макросы и т.д. Однако команда which более переносима.

Ответ 7

Альтернативой type -a является command -V

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

command -V lshw | head -n1