Список всех команд, которые знает оболочка

Список всех команд, которые знает оболочка

Какую команду я могу ввести в своей оболочке (которая, как оказалось, называется bash), чтобы получить список всех распознаваемых команд?

Также, отличается ли это в зависимости от оболочки? Или у всех оболочек есть просто "каталог" команд, которые они распознают?

Во-вторых, другой вопрос, но как я могу переопределить любой из них? Другими словами, как я могу написать свою собственную viewкоманду, чтобы заменить существующую в моей системе Ubuntu, которая, кажется, просто загружает vim.

решение1

Вы можете использоватьcompgen

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

К вашему сведению:

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.

решение2

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

  • Псевдонимы: это псевдонимы для команды с некоторыми опциями. Они определены в файле инициализации оболочки ( ~/.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 есть пограничный случай: хешированные команды.

Справочное руководство по 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.

Если вы хотите продублировать существующую команду,определить псевдоним или функцию.

¹ Исключение: несколько встроенных функций (называемыхспециальные встроенные функции) не может быть затенена функцией — хотя bash и zsh не соответствуют POSIX в этом отношении в своем режиме по умолчанию.

решение3

Попробуйте это, используя:

(   # usage of a sub processus: the modificaion of PATH variable is local in ( )
    PATH+=:EOF # little hack to list last PATH dir
    printf '%s\n' ${PATH//:/\/* }
)

решение4

Если вы нажмете клавишу Tab дважды, а затем y, вы получите список всех доступных команд в вашей текущей оболочке. Для второго вопроса, я думаю, вам следует использовать alias:псевдоним оболочки.

Связанный контент