Команда Linux - список усіх доступних команд та псевдонімів


280

Чи є команда Linux, яка перелічить усі доступні команди та псевдоніми для цього термінального сеансу?

Ніби ви набрали "a" і натиснули вкладку, але для кожної літери алфавіту. Або виконувати "псевдонім", але також повертати команди.

Чому? Я хотів би виконати наступне і побачити, чи є команда:

ListAllCommands | grep searchstr

двічі натисніть кнопку TAB, щоб перелічити всі команди, доступні для оточення
ntshetty

Відповіді:


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.
Toby Speight

Насправді, ubuntu показує "нічого не підходить" whatis compgenта "Немає ручного запису" для man compgen.
MarAvFe

1
@MarAvFe: Це тому, що це bashвбудована, а не окрема команда зі своєю власною сторінкою man. Вам потрібно буде прочитати bash(1)довідкову сторінку або запустити help compgenв bashкомандному рядку.
camh

За допомогою розширення compgen -c | sort | uniq | lessкоманда "Друк" друкує всі доступні команди без дублювання рядків та сортування за алфавітом.
Fabián

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, і якщо користувач хоче, щоб вихід був відсортований, вони можуть це зробити.
danio

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
Навіть якщо це не відповідь на запитання, я вважаю, що це краще рішення проблеми, то заклик поздоровитись. Таким чином, ви можете ввести -a foo, а якщо foo недоступний, він повертає команду не знайдено або щось подібне. Таким чином, ви можете перевірити наявність команди, не викликаючи саму команду.
Януш

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

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

6

Використовуйте "котрий пошук". Повертає або шлях двійкового чи встановлення псевдоніму, якщо це псевдонім

Редагувати: Якщо ви шукаєте список псевдонімів, ви можете використовувати:

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//:/ })?
mschilli

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 (у пошуку не є -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_proprietary_build_info_here> Пн 12 грудня 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
призматичнийбр

3

Корисно перераховувати команди на основі ключових слів, пов’язаних із командою.

Використання: man -k "your keyword"

сміливо поєднуються з:| grep "another word"

наприклад, щоб знайти текстовий редактор: man -k editor | grep text


2

Спробуйте натиснути ALT-? (альт та знак запитання одночасно). Дайте йому секунду-дві для складання списку. Це повинно працювати в баш.


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робиш як саме?
Toby Speight

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" у своєму імені або їх короткий опис, і перекачує, що "менш" пейджер. (Ви також можете замінити "менше" на $ 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. скидає функції, що знаходяться в оточенні
  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 = ":"

   за p в $ {PATH}
   робити
      ls $ p | греп $ 1
   зроблено

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

Приклад використання:

$ командно-пошуковий гном
gnome-audio-profile-властивості *
gnome-eject @
gnome-keyring *
gnome-keyring-демон *
gnome-mount *
gnome-open *
гном-звукозапис *
gnome-text editor @
gnome-umount @
gnome-volume-control *
polkit-gnome-авторизація *
vim.gnome *
$

FYI: 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
Gary

-3

Чому ви просто не набираєте:

seachstr

У терміналі.

Шкаралупа скаже щось подібне

seacrhstr: command not found 

Редагувати:

Гаразд, я беру участь в голосі, бо відповідь дурна, я просто хочу знати: Що не так у цій відповіді !!! Автор запитував:

і побачити, чи є команда.

Введення команди скаже вам, чи вона доступна !.

Ймовірно, він мав на увазі "виконувати команду" або "включити її в сценарій", але я не можу прочитати його думку (не те, що я не можу регулярно це просто те, що він носить дефлектор читання розуму )


4
Я хочу знати, чи formathddіснує команда. О зачекайте, я просто запускаю його і бачу. гей. Дякую :)
Джефрі Хосе

5
Можливо, безпечніше використовувати "що" для цього.
danio

Враховуючи, що це переповнення стека , а не суперкористувач , програмна відповідь була б більш доречною.
Toby Speight

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.