Подтвердить что ты не робот

Bash: получить список команд, начинающихся с заданной строки

Можно ли, используя Bash, получить список команд, начинающихся с определенной строки?
Я хотел бы получить то, что напечатано нажатием <tab> дважды после ввода команды и, например, сохранить ее внутри переменной.

4b9b3361

Ответ 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

возьмет файлы, на которые у вас есть разрешение, в силу их владения. Я не вижу общего способа получить все те, которые вы можете выполнить в силу групповой принадлежности, не намного более кодируя.