Shell - Як знайти каталог якоїсь команди?


127

Я знаю, що коли ви знаходитесь в оболонці, єдиними командами, які можна використовувати, є ті, які можна знайти в деякому каталозі, встановленому на PATH. Навіть я не знаю, як бачити, які грязі є в моїй змінній PATH (і це ще одне добре запитання, на яке можна було б відповісти), що я хотів би знати:

Я приходжу до оболонки і пишу:

$ lshw

Я хочу знати команду на оболонці, яка може сказати мені, де ця команда знаходиться. Іншими словами, де знаходиться цей "виконуваний файл"?

Щось на зразок:

$ location lshw
/usr/bin

Хтось?

Відповіді:


187

Якщо ви використовуєте 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ні).


Дякую всім, хто відповів, але ця відповідь була найбільш хвилюючою! Дякую! Я думав, що я божевільний, тому що визначив (давно) спосіб зробити це: "оновити", і це робиться "оновлення apt-get; apt-get dist-upgrade 'для мене. Але наразі я намагався десь знайти файл update.sh, і не зміг його знайти. Ось чому я і почав це питання. Але тепер, використовуючи 'type -a update', я виявив, що це лише псевдонім, визначений у моєму .bashrc, розташованому в моєму ~ будинку. Дійсно дякую
Габріель Л. Олівейра

1
@Gabriel: Якщо ви не знайомі з locateцим, це може допомогти знайти файли. Він використовує базу даних, яка підтримується, за допомогою updatedbякої запускається із завдання cron. Оскільки locateшукає базу даних, а не всю файлову систему, це набагато швидше, ніж find(що може бути використане в крайньому випадку).
Призупинено до подальшого повідомлення.

Дякую. Я вивчу цей інструмент і побачу, як планується запускати updateb на Cronjob Ubuntu.
Габріель Л. Олівейра

Іноді це type -aможе заплутати. наприклад, якщо nvmце функція баш, яку мені потрібно було виконати: type -a nvm | head -n1щоб дізнатися, що саме таке nvm.
Марінос

@MarinosAn: Для функцій type -aвиводить визначення функції, а також тип виконуваних файлів. Ризик використання headполягає в тому, що у випадку імен, що мають більше одного типу, додаткові типи не виводяться. Можливо, ви захочете подивитися type -t.
Призупинено до подальшого повідомлення.

64

Подобається це:

which lshw

Щоб побачити всі команди, які відповідають на вашому шляху:

which -a lshw 

7
також яка-lshw, щоб побачити всі команди, які відповідають на вашому шляху.
AlG

Я вважаю, що це працює лише з командами (виконувані файли на $ PATH), а не з функціями.
Олів’є Лакан

whichпроблематично, тому що існує декілька реалізацій, багато з яких роблять зовсім неправильно, а інші, здається, працюють добре, але мають незвичайні сюрпризи. Вам слід віддати перевагу typeзамість цього.
трійчатка

Не працює для псевдонімів та функцій bash. Принаймні, на ubuntu. Краще використовуватиtype -a lshw
Марінос

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

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, 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.