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

32

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

Кроме того, это отличается от оболочки? Или все оболочки имеют только «каталог» команд, которые они распознают?

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

зеркало
источник
5
Пожалуйста, не объединяйте вопросы. Опубликуйте каждый как отдельный вопрос.
Тердон
Почти дубликат 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которые не являются строго говоря командами.
Стефан Шазелас
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: есть хэшированные команды.

Справочное руководство 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 в этой точке в режиме по умолчанию.

Жиль "ТАК - перестань быть злым"
источник
Другой крайний случай относится к значениям $PATHlike /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или другой файл оболочки оболочки.

kurtm
источник
2

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

printf '%s\n' ${PATH//:/\/* }
Жиль Квено
источник
1

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

coffeMug
источник
Что касается псевдонима, является ли это надежным способом переопределения и отмены переопределения ("unaliasing") команды, когда она вызывается где-либо в системе (например, из сценария оболочки)?
themirror
1
Какую оболочку вы используете? Я не могу получить двойную вкладку, чтобы перечислить все команды на моем bash.
Тердон
Я использую Bash на Ubuntu 13.04. Существует также команда compgen, которая может быть использована для получения списка всех доступных команд в bash.
coffeMug
@terdon У вас установлено завершение bash?
coffeMug
1
выключить шоу "все, если не
ясно"