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

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

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

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

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

2 ответа

Решение

E сть 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]

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

#!/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, статусы выхода, множественные входы совпадений файлов) также могут быть легко добавлены в этот контекст сценария оболочки, но я оставляю это как упражнение для читателя.

Другие вопросы по тегам