Можно ли, используя Bash, получить список команд, начинающихся с определенной строки?
Я хотел бы получить то, что напечатано нажатием <tab> дважды после ввода команды и, например, сохранить ее внутри переменной.
Bash: получить список команд, начинающихся с заданной строки
Ответ 1
Вы должны иметь возможность использовать команду compgen, например:
compgen -A builtin [YOUR STRING HERE]
Например, "compgen -A builtin l" возвращает
let
local
logout
Вы можете использовать другие ключевые слова вместо "встроенных", чтобы получить другие типы завершения. Встроенная команда дает встроенные команды. "Файл" дает вам локальные имена файлов и т.д.
Вот список действий (из BASH man-страницы для завершения, которая использует compgen):
alias Alias names. May also be specified as -a.
arrayvar Array variable names.
binding Readline key binding names.
builtin Names of shell builtin commands. May also be specified as -b.
command Command names. May also be specified as -c.
directory Directory names. May also be specified as -d.
disabled Names of disabled shell builtins.
enabled Names of enabled shell builtins.
export Names of exported shell variables. May also be specified as -e.
file File names. May also be specified as -f.
function Names of shell functions.
group Group names. May also be specified as -g.
helptopic Help topics as accepted by the help builtin.
hostname Hostnames, as taken from the file specified by the HOSTFILE shell
variable.
job Job names, if job control is active. May also be specified as
-j.
keyword Shell reserved words. May also be specified as -k.
running Names of running jobs, if job control is active.
service Service names. May also be specified as -s.
setopt Valid arguments for the -o option to the set builtin.
shopt Shell option names as accepted by the shopt builtin.
signal Signal names.
stopped Names of stopped jobs, if job control is active.
user User names. May also be specified as -u.
variable Names of all shell variables. May also be specified as -v.
Ответ 2
Интересный способ сделать это - нажать M-*
(Meta обычно остается Alt).
В качестве примера введите следующее:
$ lo
Затем нажмите M-*
:
$ loadkeys loadunimap local locale localedef locale-gen locate
lockfile-create lockfile-remove lockfile-touch logd logger login
logname logout logprof logrotate logsave look lorder losetup
Подробнее об этом можно узнать в man 3 readline
; это функция библиотеки readline
.
Ответ 3
Если вы хотите точно, как bash завершит
COMPLETIONS=$(compgen -c "$WORD")
compgen завершается с использованием тех же правил bash используется при табуляции.
Ответ 4
Ответ JacobM велик. Для этого вручную, я бы использовал что-то вроде этого:
echo $PATH | tr : '\n' |
while read p; do
for i in $p/mod*; do
[[ -x "$i" && -f "$i" ]] && echo $i
done
done
Тест перед выходом гарантирует, что будут показаны только исполняемые, обычные файлы. Вышеописанные команды начинаются с mod
.
Ответ 5
Интересно, я не знал о compgen
. Здесь script Я использовал это, что не проверяет наличие неиспользуемых файлов:
#!/bin/bash
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "[email protected]" | sort
Сохраните script где-нибудь в $PATH
(я назвал его findcmd
), chmod u+w
его, а затем используйте его точно так же, как grep
, передав ваши любимые параметры и шаблон:
findcmd ^foo # finds all commands beginning with foo
findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively
Ответ 6
Итерации по переменной $PATH и ls beginningofword*
для каждой директории в пути?
Чтобы получить его в точности эквивалентно, вам нужно отфильтровать только исполняемые файлы и отсортировать по имени (должно быть довольно легко с флагами ls и командой sort).
Ответ 7
То, что указано при попадании, это двоичные файлы в вашей PATH, которые начинаются с этой строки. Итак, если ваша переменная PATH содержит: PATH =/USR/локальные/бен:/USR/бен:/бен:/USR/игры:/USR/Lib/Java/бен:/USR/Lib/Java/JRE/бен:/USR/Lib/кварты/бен:/USR/доли/TEXMF/бен:.
Bash будет выглядеть в каждом из этих каталогов, чтобы показать вам предложения, как только вы нажмете. Таким образом, чтобы получить список команд, начинающихся с "ls", в переменную, которую вы могли бы сделать: MYVAR = $(ls/usr/local/bin/ls */usr/bin/ls */bin/ls *) Естественно, вы могли бы добавить все другие каталоги, которых у меня нет.
Ответ 8
Просто для удовольствия, другой вариант руководства:
find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print
где pattern
указывает шаблон имени файла, который вы хотите использовать. Это пропустит команды, которые не выполняются глобально, но на которые у вас есть разрешение.
[проверено на Mac OS X]
Используйте флаги -or
и -and
для создания более полной версии этой команды:
find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f
\( \
-perm -001 -or \
\( -perm -100 -and -user $(whoami)\) \
\) -print
возьмет файлы, на которые у вас есть разрешение, в силу их владения. Я не вижу общего способа получить все те, которые вы можете выполнить в силу групповой принадлежности, не намного более кодируя.