Команда Linux для получения списка всех доступных команд и псевдонимов


280

Есть ли команда Linux, которая перечислит все доступные команды и псевдонимы для этого терминального сеанса?

Как будто вы набрали «а» и нажали клавишу табуляции, но для каждой буквы алфавита. Или запускать псевдоним, а также возвращать команды.

Зачем? Я хотел бы запустить следующее и посмотреть, доступна ли команда:

ListAllCommands | grep searchstr

нажмите кнопку TAB дважды, чтобы
отобразить

Ответы:


599

Вы можете использовать встроенную в Bash (1) compgen

  • compgen -c перечислит все команды, которые вы могли бы выполнить.
  • compgen -a перечислит все псевдонимы, которые вы могли бы запустить.
  • compgen -b перечислит все встроенные модули, которые вы можете запустить.
  • compgen -k перечислит все ключевые слова, которые вы могли бы запустить.
  • compgen -A function перечислит все функции, которые вы могли бы запустить.
  • compgen -A function -abck перечислю все вышеперечисленное за один раз.

Проверьте справочную страницу для других дополнений, которые вы можете создать.

Чтобы прямо ответить на ваш вопрос:

compgen -ac | grep searchstr

должен делать то, что ты хочешь.


1
Есть ли эквивалент этого для csh / tcsh? Эти терминалы также имеют какую-то функцию автозаполнения, используемую на вкладке, так что, может быть, что-то существует?
krb686

2
Вместо compgen | grepэтого может быть более эффективно передать строку в качестве аргумента самому compgenсебе (если известно, что это префикс, как подразумевается в вопросе). В этом случае это будет compgen -ac searchstr.
Тоби Спейт

На самом деле, Ubuntu показывает «ничего не подходит» whatis compgenи «Нет ручного ввода» для man compgen.
MarAvFe

1
@MarAvFe: Это потому, что это bashвстроенная, а не отдельная команда со своей собственной страницей руководства. Вам нужно прочитать bash(1)справочную страницу или запустить help compgenиз bashкомандной строки.
17

По расширению, программа compgen -c | sort | uniq | lessвыведет все доступные команды без дублированных строк и отсортированных по алфавиту.
Фабиан

39

Добавить в .bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

Если вам также нужны псевдонимы, тогда:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

Это очень близко, но это не включая псевдонимы. Как я могу добавить псевдоним | сократить -f1 до результатов, но до сортировки?
извед

1
Зачем беспокоиться о сортировке, если единственная цель состоит в том, чтобы в любом случае поставить вывод через grep? Философия Unix состоит в том, чтобы создавать простые инструменты и затем объединять их вместе, если это необходимо, поэтому оставьте сортировку вне ListAllCommands и, если пользователь хочет отсортировать вывод, он может это сделать.
Данио

4
Сортировка заключается в удалении дубликатов.
Муравьи Аасма

1
Это не находит команды, которые являются символическими ссылками на исполняемые файлы. Используйте опцию, -Lчтобы следовать символическим ссылкам к их месту назначения. Примечание: -Lэто опция, а не часть соответствующего выражения, поэтому она должна быть помещена перед путем в командной строке. В данном случаеfind -L {}
Adaephon

1
Возможно, вы захотите перенаправить STDERR в / dev / null, чтобы подавить несуществующие предупреждения каталога. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 для совместимости с zsh)
TheLonelyGhost

27

Здесь

type -a mycommand

команда, которая перечисляет все псевдонимы и команды в $ PATH, где используется mycommand . Может использоваться, чтобы проверить, существует ли команда в нескольких вариантах. Кроме этого ... Возможно, есть какой-то скрипт, который анализирует $ PATH и все псевдонимы, но не знает ни о каком таком скрипте.


1
Даже если это не ответ на вопрос, я думаю, что это лучшее решение проблемы, чем призыв к grep. Таким образом, вы можете выполнить команду -a foo, и если foo недоступен, она возвращает команду not found или что-то в этом роде. Таким образом, вы можете проверить команду без вызова самой команды.
Януш

1
На самом деле это ответ на вопрос, поскольку ОП спросил: «Я хотел бы выполнить следующее и посмотреть, доступна ли команда», поэтому цель состоит в том, чтобы проверить, доступна ли команда, и этот ответ четко работает.
лотерея

2
@lothar, что если команда, которую вы ищете, это что-то вроде "startserver" ?, "serverstart" ?, "server-что-or-other" ?. Я знаю, я просто "grep -i" для сервера и посмотреть, если это там. К сожалению. Бззз, не с этим решением. matey :-) Я не собираюсь опровергать этот ответ (поскольку он полезен, даже если он ограничен), но полное решение будет учитывать, что grep предназначен для регулярных выражений , а не только для фиксированных строк.
paxdiablo

6

Используйте "which searchstr". Возвращает путь двоичного файла или настройки псевдонима, если это псевдоним

Изменить: Если вы ищете список псевдонимов, вы можете использовать:

alias -p | cut -d= -f1 | cut -d' ' -f2

Добавьте это в любой ответ поиска PATH, который вам нравится. Предполагается, что вы используете Bash ..


6

Другие команды не работают для меня во встроенных системах, потому что они требуют bash или более полной версии xargs (busybox был ограничен).

Следующие команды должны работать в любой Unix-подобной системе.

Список по папке:

ls $(echo $PATH | tr ':' ' ')

Список всех команд по имени

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

Это все еще зависит от tr. Почему не просто ls $(echo ${PATH//:/ })?
мщилли

5

Попробуйте этот скрипт:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

Пока это единственное решение кода, которое делает это для всех команд, а не просто для того, чтобы увидеть, существует ли данная известная команда. +1.
paxdiablo

3

Для пользователей Mac ( find не имеет -executable и xargs не имеет -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

Спасибо за это. На самом деле я использую не-Mac Unix, где ответ @AntsAasma не работает. Это работает для меня на Mac и мой Unix тоже. Какую команду я могу набрать, чтобы определить версию Unix, на которой я нахожусь, чтобы я мог ответить здесь, чтобы помочь другим в моей проблеме?
prismaticorb

Linux <corporate_pprietary_build_info_here> понедельник, 12 декабря 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Полезно перечислить команды на основе ключевых слов, связанных с командой.

Использование: man -k "your keyword"

не стесняйтесь сочетать с:| grep "another word"

например, чтобы найти текстовый редактор: man -k editor | grep text


2

Попробуйте нажать ALT-? (alt и вопросительный знак одновременно). Дайте секунду или две, чтобы построить список. Это должно работать в Bash.


3
Или попробуйте нажать клавишу Esc в начале пустой строки четыре раза.
Эфимент

Это удивительно полезно, и я еще не знал, спасибо :-)
Крис Хуанг-Ливер

2

Вот решение, которое дает вам список всех исполняемых файлов и псевдонимов. Он также переносим на системы без xargs -d(например, Mac OS X) и правильно обрабатывает пути с пробелами в них.

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

Использование: myscript.sh [grep-options] patternнапример, чтобы найти все команды, которые начинаются с lsрегистра без учета регистра, выполните:

myscript -i ^ls

2

ярлык метод, чтобы перечислить все команды. Откройте терминал и дважды нажмите кнопку «вкладка» . Это показывает все команды в терминале


1
И как это grepточно?
Тоби Спейт

2

Кроме того, вы можете получить удобный список команд в сочетании с краткими описаниями (при условии, что у команды есть справочная страница, что большинство делает):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

Тогда вы просто делаете это так, как хотите.

apropos -s 1 '' | grep xdg

выходы:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

Результаты не сортируются, поэтому, если вы ищете длинный список, вы можете бросить | сортировать | в середину, а затем направьте это на пейджер, как меньше / больше / больше. ала:

apropos -s 1 '' | sort | grep zip | less

Который возвращает отсортированный список всех команд, которые имеют «zip» в названии или кратком описании, и прокачивает этот «менее» пейджер. (Вы также можете заменить «less» на $ PAGER и использовать пейджер по умолчанию.)


1

Вы всегда можете к следующему:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

Оболочка выполнит команду, только если они все равно перечислены в пути env var.


1

это зависит от того, что я имею в виду, это зависит от того, какую оболочку вы используете. Вот ограничения, которые я вижу:

  1. должен выполняться в том же процессе, что и ваша оболочка, чтобы перехватывать псевдонимы, функции и переменные, которые будут влиять на команды, которые вы можете найти, подумайте PATH или EDITOR, хотя EDITOR может быть вне области видимости. Вы можете иметь неэкспортированные переменные, которые могут влиять на вещи.
  2. это зависит от оболочки или вы уходите в ядро, / proc / pid / enviorn и друзья не имеют достаточно информации

Я использую ZSH, поэтому вот ответ zsh, он делает 3 вещи:

  1. путь дампов
  2. сбрасывает псевдонимы
  3. сбрасывает функции, которые находятся в env
  4. сортирует их

вот:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

Если вы используете zsh, это должно быть сделано.


0

Проблема в том, что завершение табуляции ищет ваш путь, но не все команды находятся на вашем пути.

Чтобы найти команды на вашем пути, используя bash, вы можете сделать что-то вроде:

для х в echo $PATH | cut -d":" -f1; сделать ls $ x; сделано


0

Вот функция, которую вы можете поместить в ваш файл bashrc:

функция команда-поиск
{
   oldIFS = $ {IFS}
   IFS = ":"

   для р в $ {PATH}
   делать
      ls $ p | grep $ 1
   сделано

   IFS экспорта = $ {oldIFS}
}

Пример использования:

$ command-search gnome
гном-аудио-профили-свойства *
гном-выталкивание @
гном-брелок *
гном-брелок-демон *
Gnome-крепление *
гном открыть *
гном-звук-рекордер *
гном-текстовый редактор @
гном-размонтировать @
гном-объемно-контроль *
polkit-гном-авторизации *
vim.gnome *
$

К вашему сведению: IFS - это переменная, которую bash использует для разделения строк.

Конечно, могут быть и лучшие способы сделать это.


-1

может быть, я неправильно понимаю, но что если вы нажмете Escape, пока не получите возможности «Показать все X»?


-2
compgen -c > list.txt && wc list.txt

1
Попробуйте добавить краткое описание того, что это делает или как это должно работать. Как минимум, укажите справочную ссылку (обычно соответствующую страницу руководства) для последующей работы и понимания предложенного решения.
TheCodeArtist

Использование файла не всегда хороший вариант. Если вам нужно, то, по крайней мере, сделайте это tmp-файлом (если безопасность не проблема.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Гари

-3

Почему бы вам просто не набрать:

seachstr

В терминале.

Оболочка скажет что-то вроде

seacrhstr: command not found 

РЕДАКТИРОВАТЬ:

Хорошо, я принимаю отрицательный ответ, потому что ответ глуп, я просто хочу знать: что не так с этим ответом !!! Аскер сказал:

и посмотреть, если команда доступна.

Ввод команды скажет вам, если она доступна!

Возможно, он имел в виду «без выполнения команды» или «включить ее в сценарий», но я не могу читать его мысли (не то, что я не могу регулярно, просто он носит дефлектор чтения мыслей )


4
Я хочу знать, formathddсуществует ли команда. Ой, подождите, я просто запустить его и посмотреть. гы. Спасибо :)
Джеффри Хосе

5
Вероятно, безопаснее использовать «который» для этого.
Данио

Учитывая, что это переполнение стека , а не суперпользователь , программный ответ был бы более уместным.
Тоби Спейт

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.