Перерахуйте всі команди, які знає оболонка


32

Що я можу набрати в моїй оболонці (що трапляється bash), що перелічить усі команди, які розпізнаються?

Також, чи відрізняється це за оболонкою? Або всі оболонки просто мають "каталог" команд, які вони розпізнають?

По-друге, інше питання, але як я можу змінити будь-яке з них? Іншими словами, як я можу написати власну viewкоманду для заміни тієї, що існує в моїй системі Ubuntu, яка, здається, просто завантажується vim.


5
Будь ласка, не поєднуйте запитання. Опублікуйте кожне як окреме запитання.
terdon

Близький дублікат unix.stackexchange.com/q/63073/135943 (я зв'язався в обох напрямках)
Wildcard

Відповіді:


61

Можна використовуватиcompgen

compgen -c # will list all the commands you could run.

FYI:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
Зверніть увагу , що compgen -cбуде включати в себе такі речі , як {або whileщо не строго кажучи команди.
Stéphane Chazelas

13

Оболонка знає чотири види команд.

  • Псевдоніми: це прізвиська для команди з деякими параметрами. Вони визначені у файлі ініціалізації оболонки ( ~/.bashrcдля bash).
  • Функції: вони - фрагменти коду оболонки з назвою. Як і псевдоніми, вони визначаються у файлі ініціалізації оболонки.
  • Вбудовані: оболонка постачається з невеликою кількістю вбудованих команд. Більшість вбудованих маніпулює станом оболонки ( cdзмінює поточний каталог, setзмінює параметри та позиційні параметри, exportзмінює середовище,…). Більшість оболонок пропонують в основному однакові вбудовані елементи, але кожна оболонка має кілька розширень до базового набору.
  • Зовнішні команди: вони не залежать від оболонки. Як і інші програми, оболонка виконує зовнішні програми, шукаючи їх у виконуваному шляху пошуку . PATHЗмінна середовища містить розділений двокрапкою список каталогів для пошуку програм.

Якщо є команди декількох типів з однойменною назвою, виконується перша відповідність у наведеному вище порядку¹.

Ви можете побачити, якому типу команди відповідає ім’я, запустивши type some_name.

Ви можете перелічити псевдоніми, запустивши aliasвбудований без аргументів. Немає можливості перелічити функції або вбудовані елементи, які працюють у всіх оболонках. Список вбудованих файлів можна знайти в документації на оболонку.

В bash, setвбудований перелік функцій з їх визначеннями, а також змінні. У bash, ksh або zsh typeset -fперераховуються функції з їх визначеннями. У bash ви можете перелічити всі назви команд будь-якого типу compgen -c. Ви можете використовувати compgen -A alias, compgen -A builtin compgen -A functionщоб список команд типу конкретного. Ви можете передати додатковий рядок до compgenсписку лише команд, які починаються з цього префікса.

У Zsh, ви можете отримати список доступних в даний момент команд даного типу з echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}і echo ${(k)commands}(тільки що останніми списками зовнішніх команд).

У наведеному нижче фрагменті оболонки-агностику перелічені всі зовнішні програми:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

У Bash є крайній випадок: хеш-команди.

Посібник Баша говорить:

Повний пошук каталогів у $ PATH виконується лише в тому випадку, якщо команда не знайдена в хеш-таблиці

Спробуйте:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

PATHЗмінна середовища не містить ~/dir-for-wat-command, compgen -cне вказує wat, але ви можете запустити wat.

Якщо ви хочете затінити існуючу команду, визначте псевдонім або функцію .

¹ Виняток: кілька вбудовані команди ( так звані спеціальні вбудовані команди ) не можуть бути затьмарені функції - баш і ЗШ не відповідають стандарту POSIX на той момент в їх режимі по замовчуванням , хоча.


Інший крайній випадок стосується значень $PATHтипу /bin:/usr/bin:(трейлінг :), де не вдалося б перерахувати виконувані файли в поточному каталозі.
Стефан Шазелас

3

Список команд складається з двох наборів:

  1. Команди, вбудовані в оболонку
  2. Команди у вашому PATH

Ви не можете змінити вбудовані модулі, але ви можете уберегти оболонку від використання вбудованого, вказавши як повне ім’я шляху /bin/echo.

Щодо команд у вашому PATH, ви можете змінити це. PATHце розділений двокрапкою список каталогів, на який слід шукати команди. Перший знайдений файл "виграє".

export PATH=~/bin:${PATH}

(Цей синтаксис не працює для cshоболонок-похідних, але всіх інших, про які я знаю).

Те , що експорт PATHз ~/binпершим записом з подальшою іншими існуючими PATHзаписами. Тож тепер ваша оболонка перевірить directory calledbin in your home directory for a command *first* before checking the standardPATH` налаштовану систему. Ви можете легко змусити його перевіряти новий каталог, використовуючи:

export PATH=${PATH}:~/bin

Щоб PATHзберегти подальший вхід у систему, додайте його до .profileіншого файлу rc оболонки.



1

Якщо двічі натиснути клавішу вкладки, а потім y, ви отримаєте список усієї доступної команди у вашій поточній оболонці. Для другого питання, я думаю, ви повинні використовувати псевдонім: псевдонім оболонки .


Що стосується псевдоніму, чи є неправдивим способом переосмислення та відміни команд ("недопущенням") команди, коли вона викликається в будь-якому місці системи (наприклад, із скрипту оболонки)?
термар

1
Яку оболонку ви використовуєте? Я не можу отримати подвійну вкладку, щоб перелічити всі команди на моєму баші.
тердон

Я використовую bash на Ubuntu 13.04. Існує також команда під назвою compgen, за допомогою якої можна отримати список усіх доступних команд на bash.
coffeMug

@terdon У вас встановлено баш-завершення?
coffeMug

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