Настройка алиасов (alias, псевдоним команды) была одной из первых задач, которую я решал, редактируя конфигурационные файлы (dotfiles) в Unix-подобных ОС. Вот пример одного из моих очень ранних алиасов:

alias g=git

Благодаря этой конструкции я могу, когда мне это нужно, вызвать, вместо команды git, команду g. Это позволяет сэкономить немного времени при использовании тех команд, к которым я прибегаю десятки раз в день!

# Теперь эти две команды равноценны:
git status
g status

Раньше я задавал псевдонимы команд с помощью команды alias. В конце концов… я ведь создавал то, что называется «alias»!

Но со временем я понял, что мне, похоже, удалось найти лучший способ создания альтернативных версий команд. Он заключается использовании скриптов в переменной окружения $PATH.

Как работает этот механизм

В моей домашней директории есть папка со скриптами, называемая bin. Вот, например, упрощённая версия ~/bin/g:

#!/usr/bin/env bash
exec git "$@"

Запуск этого скрипта просто приводит к запуску git.

Я добавил эту папку в мою переменную $PATH. (О том, как это сделать, можете прочитать здесь.) В файле .zshrc у меня есть такая строчка:

export PATH="$HOME/bin:$PATH"

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

Работает это всё точно так же, как и алиасы. Как и раньше — команда g status эквивалентна команде git status.

# Эти две команды по-прежнему идентичны:
git status
g status

Для создания псевдонимов команд с помощью скриптов требуется вводить гораздо больше текстов. Почему же я пользуюсь именно этим способом?

Преимущества скриптов перед командой alias

У применения скриптов есть несколько преимуществ перед командой alias.

  • Не нужна перезагрузка: изменения вступают в силу немедленно. Когда я создаю, обновляю или удаляю псевдоним, пользуясь командой alias, мне нужно перезагружать .zshrc. Я это делаю, открывая новое окно терминала, или выполняя команду source ~/.zshrc. А вот если я применяю скрипты, мне всего этого делать не нужно! Можно просто редактировать файлы в директории ~/bin, и всё тут ж�� будет работать как надо. Это облегчает жизнь в том случае, если нужно что-то часто менять или подстраивать.

  • Выбор языка программирования. Я, для многих, но не для всех моих скриптов, использую Bash. Например, у меня есть скрипт, позволяющий делать заметки, называемый ~/bin/note, который мне не хотелось писать на Bash. Я написал его на Python. А если бы я пользовался командой alias — мне пришлось бы писать его в среде Zsh.

  • Больше пространства для работы. Традиционные алиасы обычно используются для решения простых задач — вроде запуска git по команде g. Но в папке ~/bin у меня есть скрипты, которые решают немного более сложные задачи. Например, ~/bin/sleepybear переводит компьютер в спящий режим. Эта задача по-разному решается в Linux и в macOS. Легче предусмотреть нужную логику в скрипте, чем в обычном алиасе. (Ещё я могу это сделать с помощью функции оболочки.)

  • Лучшая переносимость. Обычно я использую Zsh, но изредка применяю Bash и хочу дать ещё один шанс Fish. Если бы я пользовался обычными алиасами, мне пришлось бы вручную переносить нужные настройки между разными оболочками. А пользуясь директорией ~/bin я сильно упрощаю себе жизнь: достаточно добавить её в $PATH и всё готово.

Мне этих преимуществ достаточно для того, чтобы использовать скрипты в роли стандартного механизма создания псевдонимов команд. Даже для простых, вроде g=git.

Преимущества команды alias перед скриптами

Мой выбор — скрипты, но они не идеальны. Всё в программировании связано с какими-либо компромиссами.

Вот несколько преимуществ команды alias перед скриптами:

  • Особые возможности. Команда alias и функции оболочки обладают особыми возможностями, которых нет у скриптов. Например, я, с помощью команды alias cd..='cd ..', назначил псевдоним cd.. для команды cd ... Сделал я так из-за того, что часто ввожу эту команду неправильно, забывая о пробеле. Ещё у меня есть функция оболочки boop, которая воспроизводит звук, зависящий от статуса выхода предыдущей команды. Скрипты оболочки, ��асколько мне известно, на такое не способны. Они не могут менять рабочие директории внешних процессов и не могут узнавать статусы выхода других процессов. Если что-то очень сложно или невозможно сделать с помощью скрипта — я возвращаюсь к команде alias или к функции оболочки.

  • Сохранение автодополнения команд. Пользователь pwagland упомянул на HackerNews о преимуществе команды alias перед скриптами. Оно заключается в сохранении стандартной возможности автодополнения команд. Если сделать псевдоним для команды git с помощью конструкции g=git — это позволит нормально работать автодополнению при вводе команды g и нажатии на клавишу <tab>. При использовании скриптов реализация такого поведения потребует некоторых дополнительных усилий.

  • Условные объявления псевдонимов. Сложнее создать условное объявление файла в ~/bin, чем условное объявление псевдонима с помощью alias. Например, мне нравится команда open, которая присутствует в macOS. В Linux, где её нет, я объявляю соответствующий псевдоним с помощью alias. А в macOS этот псевдоним не существует, так как я определяю его условно.

  • Псевдонимы легче обходить. Я назначил псевдоним vim команде nvim, но иногда мне нужно запустить настоящий редактор Vim. Bash и Zsh предлагают несколько способов обхода псевдонимов, созданных с помощью alias. Например — я могу прибегнуть к команде \vim. А применяя скрипты оболочки из $PATH сделать этого я не могу. Обойти настройки, заданные скриптами, можно несколькими не очень удобными способами: воспользоваться полным путём, вроде /usr/bin/vim; временно убрать ~/bin из $PATH; временно переместить весь скрипт.

  • Меньшие затраты времени на создание псевдонимов. Когда я создаю новый скрипт — мне нужно создать новый файл в ~/bin, нужно написать в начале этого файла #!/usr/bin/env bash, а так же нужно сделать этот файл исполняемым. Это не так уж и сложно, но гораздо быстрее просто ввести строку текста alias g=git. (Для того чтобы упростить эту задачу, я написал скрипт mksh).

  • Производительность. Я сделал, для себя, один тест, и выяснил, что псевдонимы, созданные с помощью alias, работают более чем в 100 раз быстрее, чем скрипты. В этом есть смысл, так как компьютеру нужно найти на диске файл из $PATH, нужно его распарсить и выполнить. Всё это делается гораздо медленнее, чем запуск команды, которая, вероятно, хранится в памяти. Я, на практике, ни разу не замечал этой разницы в производительности, но, возможно, я бы её заметил, если бы вызывал g сотни раз в секунду.

Выбирайте то, что вам нравится

В итоге можно сказать, что решение о том, что применять — alias, или скрипты — не приведёт к каким-то особенным последствиям. Эти методы создания псевдонимов команд очень похожи. Но я обычно использую именно скрипты, так как мне нравится то, на что они способны.

О, а приходите к нам работать? 🤗 💰


Мы в wunderfund.io занимаемся высокочастотной алготорговлей с 2014 года. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.

Мы предлагаем интересные и сложные задачи по анализу данных и low latency разработке для увлеченных исследователей и программистов. Гибкий график и никакой бюрократии, решения быстро принимаются и воплощаются в жизнь.

Сейчас мы ищем плюсовиков, питонистов, дата-инженеров и мл-рисерчеров.

Присоединяйтесь к нашей команде