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

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

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

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

2 ответа2

4

Существует 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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .