Могу ли я использовать команду `which` для частичного совпадения?

342
ironsand

Я хочу найти все программы с такими именами, как "gcc", "gcc-4.2", "gcc-4.9" и так далее.

Чтобы найти все двоичные файлы, которые я пытался с which -a gcc* .

Но «*» не распознается как «любой» с which командой.

Есть ли способ найти все программы в переменной окружения PATH по совпадению с образцом?

0
В большинстве оболочек вы можете просто набрать `gcc` и дважды нажать клавишу Tab для его автозаполнения. Это работает для вас или какова ваша ситуация? То есть зачем тебе это? slhck 11 лет назад 2
В UNIX и Linux `*` расширяется перед тем, как программа выполняется. Это означает, что интерпретация не зависит от программы. В этом случае `gcc *` раскрывается в текущем каталоге. Вот почему это не работает. MSalters 11 лет назад 1
В OSX по умолчанию gcc основан на llvm, который помещается в `/ usr / bin / gcc`. и с помощью `brew` установленный gcc помещается в` / usr / local / bin / gcc-4.x`. Я хотел знать, что есть другие программы `gcc- *`. Конечно, я могу использовать `find`, но это занимает некоторое время. ironsand 11 лет назад 0
Спасибо MSalters! Мне не было ясно об этом. Я думал, что это зависит от программ. ironsand 11 лет назад 0
Если вы просто ищете те, что есть в вашей переменной $ PATH, самый простой способ - дважды нажать вкладку, как предложено в @slhck. terdon 11 лет назад 1
Спасибо, Тердон. Я неправильно понял, что он написал. Я ударил только один раз. ironsand 11 лет назад 0

2 ответа на вопрос

4
justbrowsing

Существует BASHвстроенная команда, compgenкоторая может быть использована для отображения всех команд, функций, псевдонимов и встроенных модулей .

compgen -abck | grep "gcc" 

Параметры: help compgen

compgen: [-abcdefgjksuv]  [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word] 
2
Daniel Andersson

Вот быстрый и грязный пример сценария, который поможет вам на практике:

#!/bin/sh IFS=: for i in $PATH; do for j in "$i"/$1; do [ -f "$j" ] && [ -x "$j" ] && printf '%s\n' "$j" done done 

Сохраните это как например whichglobи сделайте его исполняемым. Образец прогона:

$ echo $PATH /usr/local/bin:/usr/bin:/bin $ ./whichglob grep* /usr/bin/grepdiff /usr/bin/grep-excuses /usr/bin/grepjar /bin/grep 

На самом деле все функции в which( -aстатусы выхода, множественные входы совпадений файлов) также могут быть легко добавлены в этот контекст сценария оболочки, но я оставляю это как упражнение для читателя.