хеш не показывает мне список команд Bash

Я читал в книге Bash O'reilly (третий выпуск, 2005), что я понял как это, если я выполнюсь hash Я буду видеть "хеш-таблицу" со списком всех возможных команд Bash плюс все команды, характерные для большинства сред включая Bash, которые доступны в моей системе.

Все же в WSL-Ubuntu (16.04 - гостеприимный) я выполнился hash и стал справедливым:

hits    command
   1    /usr/bin/mesg

Это могло бы быть уникально для WSL (у меня нет non-WSL машины Ubuntu для тестирования на прямо сейчас)?

Обновление

Я неправильно понял главу - хеш-таблица не включает все команды Bash, но по-видимому все недавно используемые команды неудара (с путем к файлам, содержащим их данные);

просто, что авторы дали список, содержащий некоторые очень общие команды, я по ошибке перепутал как "встроенный" от беглого взгляда в списке, хотя они - автономные утилиты (и вот список из книги - страница 72):

cat
stat
less
man
apropos
more
ln
ls
ps
vi

Конечно, это не Bash встроенные команды как cd, echo, set, shopt, source, bash, if, case, for, while, kill, trap, exit, и т.д., но автономные утилиты, очень распространенные в основанных на Bash средах.

К настоящему времени я усвоил различие достаточно глубоко и кротко полагаю, что не перепутаю этим смущающим способом снова. Это - важный урок для меня; я никогда действительно погрузился достаточно глубоко на различиях между тем, какая очень общая программа является встроенным Bash или "очень общая" утилита в основанных на Bash средах, которые могли бы быть схвачены как "встроенное", но моя позиция - "не больше!".

0
задан 26 November 2018 в 21:25

1 ответ

Как help hash шоу, hash функция используется, чтобы определить и помнить полные пути программ:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
    Remember or display program locations.

    Determine and remember the full pathname of each command NAME.  If
    no arguments are given, information about remembered commands is displayed.

    Options:
      -d        forget the remembered location of each NAME
      -l        display in a format that may be reused as input
      -p pathname       use PATHNAME as the full pathname of NAME
      -r        forget all remembered locations
      -t        print the remembered location of each NAME, preceding
                each location with the corresponding NAME if multiple
                NAMEs are given
    Arguments:
      NAME      Each NAME is searched for in $PATH and added to the list
                of remembered commands.

    Exit Status:
    Returns success unless NAME is not found or an invalid option is given.

В Вашем случае это возвращается /usr/bin/mesg потому что, очевидно, mesg был назван прежде и hash теперь помнит его путь.

Надевать справку bash builtins, функции и т.д. существует help функция. Назовите его без аргумента для получения списка команд оболочки, определенных внутренне. Получить список bash builtins можно использовать compgen -b.

4
ответ дан 27 October 2019 в 01:43

Другие вопросы по тегам:

Похожие вопросы: