Subshell `(псевдоним; объявление -f)` в функции - PullRequest
0 голосов
/ 25 февраля 2020

Я определил следующую which функцию, как рекомендовано в man which:

Рекомендуемый способ использования этой утилиты - добавить псевдоним (C shell) или функцию оболочки (Bourne). shell), например:

which()
{
    (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
export -f which

В отличие от /usr/bin/which, который находит только команды, эта функция находит команды, псевдонимы и функции. Мой вопрос: почему (alias; declare -f) направляется в /usr/bin/which $@?

1 Ответ

0 голосов
/ 25 февраля 2020

/usr/bin/which не встроен в оболочку. Следовательно, он не может получить доступ к внутреннему состоянию оболочки (например, к псевдонимам или определениям функций), если только это содержимое не введено в него.

Вот что здесь делается.

Однако это абсолютно ненужно на любой современной оболочке. Информация о синтаксисе фида оболочки для внешней программы, которая там анализируется, по своей природе ненадежна по сравнению с тем, что сама оболочка дает вам необходимый вывод.

Не делайте этого. Вместо этого используйте встроенную оболочку type.

...