Есть ли встроенный bash для «который»?

16

Я тестировал минимальную установку Fedora. Чтобы проверить путь для интерпретаторов, таких как python или node, я обычно использую which.

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

Я использую Bash 4.2.

mikemaccana
источник
1
Каким-то образом поиск эквивалента Windows привел меня сюда; для будущих зрителей: «где» скажет вам путь к данному файлу.
резиновая утка
1
Я призываю всех, кто сталкивается с этим Q, также прочитать эти вопросы и ответы U & L. Он охватывает все, что вы когда-либо хотели знать which. Почему бы не использовать «который»? Что использовать тогда?
Slm

Ответы:

26

Вы можете использовать type, который является встроенным в Bash:

$ type -P which
which is /usr/bin/which

См. Документацию, help [t]ypeкоторая ссылается на typeраздел на bashстранице руководства .

( help typeпечатает справочные страницы для двух встроенных функций, которые начинаются со строки «type», одна из которых устарела и совершенно не связана с этим.)

l0b0
источник
3
Я люблю type -aсебя почему скобки в [t]ype?
Гленн Джекман
type -aнапечатает все, на что указывает аргумент, а не только то, что будет выполнено при его наборе.
10
2
Я призываю всех, кто сталкивается с этим Q, также прочитать эти вопросы и ответы по U & L. Он охватывает все, что вы когда-либо хотели знать which. Почему бы не использовать «который»? Что использовать тогда?
Slm
Первым делом в списке type -aвсегда будет то, что он будет выполнять. Я делаю так же, как Гленн, и всегда использую type -aтоже.
Slm
1
type -pне показывает путь, если команда является псевдонимом. type -Pвсегда показывает путь к команде правильно. я думаю. мы должны обновить обслуживаемый ответ , как type -P@ l0b0
Dirigeant
10

Вы можете использовать typeили command -v. Вывод typeпонятен человеку; вывод command -vможет быть выполнен Bash.

Обратите внимание, что они на самом деле немного отличаются. typeи commandнайдите хешированное значение команды. То есть, если вы печатаете cmd, type cmdили command -v cmdскажет вам точно , что будет работать. Они также работают с псевдонимами, функциями Bash и встроенными функциями Bash (хотя type -pигнорируют их и возвращают только истинные файлы).

whichпросто делает поиск по PATH. Это отличается, потому что:

  • Если существует псевдоним, функция или встроенный модуль с тем же именем, он будет вызван вместо этого.
  • Если команда была добавлена ​​ранее в PATH с момента последнего хэширования, она будет найдена which, но при выполнении этой команды будет использоваться хешированное значение (вы можете принудительно обновить хеш в Bash с помощью hash -r).

Обычно люди действительно хотят type, whichпо крайней мере, для интерактивного использования, поскольку они используют его, чтобы выяснить, "откуда эта команда приходит, когда я ее запускаю?" Вы должны использовать толькоwhich если вы действительно хотите сделать поиск PATH.

asmeurer
источник
command -vявляется эквивалентом ksh whence.
Хенк Лангевелд
1
Таким образом , у нас есть where, whenceи, конечно же who, whyи when? Почему нету what?
Хаген фон Айцен
echo 'main(){printf("what\n");}' | sudo cc -x c - -o /usr/local/bin/what
Иван Вучица,