‘which’ против ‘type -a’

Вопрос или проблема

Есть статья 2022 года от человека, который является старшим разработчиком, и там у него есть следующий псевдоним в конфигурации zsh:

alias which="type -a"

Но у zsh по умолчанию есть which, и если использовать этот which как which cp, то вывод будет

/bin/cp

Тогда как вывод type -a cp будет

cp is /bin/cp

Разница слишком тонкая, чтобы делать псевдоним. Так что может быть практическая разница, которую я упустил из виду?

В старые времена which был скриптом csh; например, SunOS 4.1 /usr/ucb/which начинался так:

#! /bin/csh -f
#
#       @(#)which.csh 1.8 88/02/08 SMI; from UCB 4.2 83/02/14
#
#       which : показывает, какую программу вы получаете
#
# Установить prompt, чтобы .cshrc думал, что мы работаем в интерактивном режиме и установил псевдонимы.
# Сохранить и восстановить path, чтобы избежать его изменения .cshrc.
set _which_saved_path_ = ( $path )
set prompt = ""
if ( -r ~/.cshrc && -f ~/.cshrc ) source ~/.cshrc

Кто-то, переходящий с csh на bash на этих старых системах, мог легко создать псевдоним, чтобы облегчить свой переход; у bash нет встроенной команды which, и скрипт csh не будет работать правильно (потому что он не знает о псевдонимах или функциях bash, например).

Этот псевдоним мог легко перейти вместе с ним, когда он мигрировал на zsh.

Я изначально сделал что-то подобное, когда переходил с csh на ksh88, где я сделал which псевдонимом для whence.

Ответ или решение

Вопрос о различии между командами which и type -a в контексте среды оболочки Zsh актуален для системных администраторов и разработчиков, работающих на Unix-подобных системах. Чтобы понять, почему некоторые пользователи создают алиас which="type -a", важно тщательно рассмотреть функциональность обеих команд и историю их применения.

Теория

which и type — это команды, используемые для нахождения местоположения выполняемых программ в системе.

  1. Команда which:

    • Обычно используется для определения пути к исполняемым файлам, присутствующим в переменной окружения PATH.
    • Работает только с внешними командами и не учитывает внутренние команды оболочки или алиасы.
    • В некоторых реализациях она просто делает поиск в директориях, перечисленных в PATH, и выводит первый найденный результат.
  2. Команда type:

    • Это встроенная команда в bash и zsh, предоставляющая подробную информацию о типе команды, в частности, является ли она встроенной в оболочку, функцией или внешним исполняемым файлом.
    • Опция -a у команды type выводит все возможные местоположения команды в порядке поиска в PATH и, что важно, также учитывает алиасы и функции оболочки.
  3. Историческая справка:

    • В старых системах Unix which была реализована как csh-скрипт, который работал специфически для csh или tcsh и не охватывал полную функциональность других оболочек, таких как bash или zsh.
    • В результате, с переходом пользователей на более современные оболочки, привычка использовать which сохранялась, но ее функциональность была ограниченной. Поэтому пользователи создавали алиасы, перенаправляющие which на более мощные команды, такие как type -a.

Пример

Рассмотрим пример использования обеих команд на типичной системе:

  • which cp может вернуть что-то вроде /bin/cp.
  • type -a cp вернет:
    cp is /bin/cp
    cp is /usr/bin/cp

Это демонстрирует, что type -a дает более полную картину, отображая все возможные пути для команды cp и включая информацию о том, что это за команда (например, внешняя команда).

Применение

Теперь, когда мы понимаем различия между двумя командами, давайте рассмотрим несколько причин, почему замена which на type -a через алиас может быть полезна:

  1. Универсальность: type -a является более универсальной командой, обеспечивающей более подробную информацию и работающей корректно со всеми компонентами оболочки, такими как функции и алиасы. Это важно для разработчиков, которые работают со сложными настройками окружения.

  2. Переносимость: Если пользователь привык работать в различных оболочках и системах, использование type -a, встроенной в большинство современных оболочек, обеспечивает более гладкий и переносимый рабочий процесс.

  3. Исторические причины: Пользователи, мигрировавшие с более старых систем на современные, могли сохранить привычку использовать which, но заменить его на более функциональную альтернативу, чтобы избежать недопонимания или проблем с производительностью.

  4. Целостность информации: type -a предоставляет более целостную информацию, что снижает шансы на ошибку, так как пользователь видит все возможные места нахождения команды, а не только первое.

Заключение

Использование алиаса which="type -a" в современных Unix-подобных системах может показаться на первый взгляд избыточным, однако с учетом исторических предпосылок и расширенных возможностей команды type, такой подход оправдан. Он улучшает точность и полноту информации о команде, что особенно актуально для продвинутых пользователей, которым необходимо глубокое понимание работы системы. В конечном итоге это улучшает эффективность работы и снижает вероятность возникновения ошибок в сложных конфигурациях среды.

Оцените материал
Добавить комментарий

Капча загружается...