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

128

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

Прихожу в оболочку и пишу:

$ lshw

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

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

$ location lshw
/usr/bin

Кто угодно?

Габриэль Л. Оливейра
источник

Ответы:

188

Если вы используете 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этого не происходит).

Приостановлено до дальнейшего уведомления.
источник
Спасибо всем, кто ответил, но этот ответ был самым захватывающим! Спасибо! Я думал, что я сумасшедший, потому что я определил (давным-давно) способ сделать это: 'update', и это делал 'apt-get update; apt-get dist-upgrade 'для меня. Но пока я пытался найти где-нибудь файл update.sh, но не смог его найти. Вот почему я начал этот вопрос. Но теперь, используя 'type -a update', я обнаружил, что это просто псевдоним, определенный в моем .bashrc, расположенном в моем ~ доме. Большое спасибо.
Габриэль Л. Оливейра,
1
@Gabriel: Если вы не знакомы с locateэтим, может помочь найти файлы. Он использует базу данных, updatedbкоторая запускается из задания cron. Поскольку locateпоиск выполняется в базе данных, а не во всей файловой системе, это намного быстрее find(что можно использовать в крайнем случае).
Приостановлено до дальнейшего уведомления.
Спасибо. Я изучу этот инструмент и посмотрю, как будет запускаться updateb в cronjob Ubuntu.
Габриэль Л. Оливейра
Иногда type -aможет сбивать с толку. например, в случае, если nvmэто функция bash, которую мне нужно было сделать: type -a nvm | head -n1узнать, что именно nvm.
Маринос Ан
@MarinosAn: для функций type -aвыводит определение функции, а также тип исполняемого файла. Риск использования headзаключается в том, что в случае имен с более чем одним типом дополнительные типы не будут выводиться. Возможно, вы захотите посмотреть type -t.
Приостановлено до дальнейшего уведомления.
65

Как это:

which lshw

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

which -a lshw 
Игнасио Васкес-Абрамс
источник
7
также which -a lshw, чтобы увидеть все команды, соответствующие вашему пути.
AlG
Я считаю, что это работает только с командами (исполняемыми файлами в $ PATH), а не с функциями.
Оливье Лакан
whichпроблематично, потому что существует несколько реализаций, многие из которых делают совершенно неправильные вещи, а другие, похоже, работают нормально, но имеют странные сюрпризы. Вы должны предпочесть type.
Tripleee
Не работает для псевдонимов и функций bash. По крайней мере, на убунту. Лучшее использованиеtype -a lshw
Marinos An
17

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
Hasen
источник
5
~$ 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
разъем
источник
3

В TENEX C Shell, tcsh , можно перечислить расположение (а) команды или, если это встроенная команда, используя whereкоманду, например:

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

tcsh% where cd
cd is a shell built-in
/usr/bin/cd
Пирз
источник
1

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

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

command -V lshw | head -n1
Маринос Ан
источник
0

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

mpez0
источник
1
В ksh whence -aпохож на Bash type -a.
Приостановлено до дальнейшего уведомления.