Вопрос или проблема
Есть статья 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
— это команды, используемые для нахождения местоположения выполняемых программ в системе.
-
Команда
which
:- Обычно используется для определения пути к исполняемым файлам, присутствующим в переменной окружения PATH.
- Работает только с внешними командами и не учитывает внутренние команды оболочки или алиасы.
- В некоторых реализациях она просто делает поиск в директориях, перечисленных в PATH, и выводит первый найденный результат.
-
Команда
type
:- Это встроенная команда в bash и zsh, предоставляющая подробную информацию о типе команды, в частности, является ли она встроенной в оболочку, функцией или внешним исполняемым файлом.
- Опция
-a
у командыtype
выводит все возможные местоположения команды в порядке поиска в PATH и, что важно, также учитывает алиасы и функции оболочки.
-
Историческая справка:
- В старых системах Unix
which
была реализована как csh-скрипт, который работал специфически для csh или tcsh и не охватывал полную функциональность других оболочек, таких как bash или zsh. - В результате, с переходом пользователей на более современные оболочки, привычка использовать
which
сохранялась, но ее функциональность была ограниченной. Поэтому пользователи создавали алиасы, перенаправляющиеwhich
на более мощные команды, такие какtype -a
.
- В старых системах Unix
Пример
Рассмотрим пример использования обеих команд на типичной системе:
which cp
может вернуть что-то вроде/bin/cp
.type -a cp
вернет:cp is /bin/cp cp is /usr/bin/cp
Это демонстрирует, что type -a
дает более полную картину, отображая все возможные пути для команды cp
и включая информацию о том, что это за команда (например, внешняя команда).
Применение
Теперь, когда мы понимаем различия между двумя командами, давайте рассмотрим несколько причин, почему замена which
на type -a
через алиас может быть полезна:
-
Универсальность:
type -a
является более универсальной командой, обеспечивающей более подробную информацию и работающей корректно со всеми компонентами оболочки, такими как функции и алиасы. Это важно для разработчиков, которые работают со сложными настройками окружения. -
Переносимость: Если пользователь привык работать в различных оболочках и системах, использование
type -a
, встроенной в большинство современных оболочек, обеспечивает более гладкий и переносимый рабочий процесс. -
Исторические причины: Пользователи, мигрировавшие с более старых систем на современные, могли сохранить привычку использовать
which
, но заменить его на более функциональную альтернативу, чтобы избежать недопонимания или проблем с производительностью. -
Целостность информации:
type -a
предоставляет более целостную информацию, что снижает шансы на ошибку, так как пользователь видит все возможные места нахождения команды, а не только первое.
Заключение
Использование алиаса which="type -a"
в современных Unix-подобных системах может показаться на первый взгляд избыточным, однако с учетом исторических предпосылок и расширенных возможностей команды type
, такой подход оправдан. Он улучшает точность и полноту информации о команде, что особенно актуально для продвинутых пользователей, которым необходимо глубокое понимание работы системы. В конечном итоге это улучшает эффективность работы и снижает вероятность возникновения ошибок в сложных конфигурациях среды.