
Какую команду я могу ввести в своей оболочке (которая, как оказалось, называется 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:псевдоним оболочки.