Поиск команд (для текущего пользователя), начинающихся с определенной буквы

Чтобы установить yaourt, откройте терминал и запустите

git clone https://aur.archlinux.org/package-query.git
cd package-query
makepkg -si
cd..
git clone https://aur.archlinux.org/yaourt.git
cd yaourt
makepkg -si
cd..

Сохраните и запустите;

sudo pacman -Sy yaourt base-devel fakeroot
yaourt -Syu --devel --aur

alsamixerявляется частью alsa-utils, пакет lightдолжен быть установлен из AUR

1
11.12.2019, 01:08
1 ответ

Команда find, которую вы показываете,

( set -f; find ${PATH//:/ } -type f -maxdepth 1 -executable )

подходит для большинства случаев, учитывая, что он был запущен на машине с установленным GNU find, который реализует как -maxdepth, так и -executable(, и я действительно не хочу пробовать для создания эквивалентного теста для -executableс использованием стандартных предикатов find). Также требуется bashдля подстановки параметров значения PATH, замены каждого :пробелом (. Это также можно сделать, установив IFS=:и используя переменную без кавычек как есть, удалив требование дляbash).

В другом ответе на аналогичный вопрос я также защитил команду findот интерпретации путей поиска как потенциальных опций с помощью --. Команда, показанная здесь, использует подход с IFS, а также слегка изменена после надлежащего тестирования :

.
(
    set -f; IFS=:
    find -L -- $PATH -maxdepth 1 ! -type d -executable
) 

! -type dгарантирует, что исполняемые символические ссылки, но не каталоги, также будут найдены. Опция -Lгарантирует, что метаданные, относящиеся к найденным символическим ссылкам, берутся из того, на что указывает ссылка (, это предотвращает поиск символических ссылок на доступные, то есть исполняемые, подкаталоги ).

Сравнение этого с compgen -cв bashпоказывает, что compgen -cсоздаст список команд, перекрывающийся с результатом приведенной выше команды find, и что любые дополнительные команды, которые находит compgen -c, ограничены встроенными -в командах, не имеющих внешней реализации.

Очевидно, чтобы ограничить это командами, начинающимися с символа g, вы также можете использовать-name 'g*'(compgen -c gвbash).

Оболочка, обеспечивающая завершение команд с помощью табуляции, например bash, может предоставлять команды для взаимодействия с этим механизмом. Эти команды вряд ли будут переносимы между оболочками и, возможно, даже между версиями одной и той же оболочки. Команда findвыше,кажется, обеспечивает довольно хорошее приближение к тому, что даст вам завершение с помощью табуляции внешних команд, и зависит только от присутствия GNU find.

Для перезаписи предиката -executableс использованием стандартных предикатов findсм. ответ Стефана Шазела на другой вопрос (, касающийся -readable, но решение аналогично -executable).

Предикат -maxdepthтакже не является стандартом -, но чаще используется в различных вариантах команды find.

1
27.01.2020, 23:40

Теги

Похожие вопросы