Почему «which» не возвращает ничего в некоторых командах, которые я могу выполнить? [дубликат]

Я использовал , который , чтобы указать местоположение исполняемого файла. Например, which pwd возвращает / bin / pwd . Однако я обнаружил , псевдоним или , который compgen и т. Д. Ничего не возвращает.

Что такое команды вроде псевдонима ? Разве это не исполняемые файлы в моем Linux? Я использую bash 4.3 на Ubuntu.

16
задан 19 November 2014 в 06:11

2 ответа

Я нашел which alias или which compgen и т.д. возвраты ничто.

Оба из тех являются оболочкой builtins. which не знает ничего из оболочки builtins: это просто ищет путь исполняемые файлы.

Для более надежного результата использовать type.

$ type compgen
compgen is a shell builtin
$ type alias
alias is a shell builtin

type имеет лучшее знание того, что выполняется, потому что это - встроенная оболочка.

Почему which ненадежно

which часто дает неправильный ответ. Наблюдайте:

$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd

Когда Вы работаете pwd, не указывая явный путь, оболочка выполнит свое встроенное, не исполняемый файл это which найденный.

Вот больше примеров which предоставление неправильного ответа:

$ type echo
echo is a shell builtin
$ which echo
/bin/echo
$ type [
[ is a shell builtin
$ which [
/usr/bin/[

Наблюдайте:

$ type /bin/echo
/bin/echo is /bin/echo

Когда Вы даете явный путь для echo, такой как /bin/echo, затем оболочка выполнила бы тот исполняемый файл, не его встроенное. type знает, что также, поскольку Вы видите выше.

Как which работы внутренне

В подобных debian системах, which простой сценарий оболочки, соответствующая часть которого:

   for ELEMENT in $PATH; do
    if [ -z "$ELEMENT" ]; then
     ELEMENT=.
    fi
    if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then
     puts "$ELEMENT/$PROGRAM"
     RET=0
     [ "$ALLMATCHES" -eq 1 ] || break
    fi
   done

Как Вы видите, это делает простой поиск вдоль ПУТИ для исполняемого файла данного имени.

27
ответ дан 16 November 2019 в 13:13

Я думаю, что это вызвано тем, что нет программы/файла, названной alias или compgen и т.д. Они могут быть всего keywords, что Bash как интерпретатор языка знает.

можно думать, что Bash является программой, и alias просто название метода в той программе.

0
ответ дан 16 November 2019 в 13:13

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

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