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