Как стать автором
Обновить
45.83
Wunder Fund
Мы занимаемся высокочастотной торговлей на бирже

Почему я не люблю использовать «alias» для создания псевдонимов команд

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2.9K
Автор оригинала: Evan Hahn

Настройка алиасов (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 разработке для увлеченных исследователей и программистов. Гибкий график и никакой бюрократии, решения быстро принимаются и воплощаются в жизнь.

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

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

Теги:
Хабы:
+4
Комментарии5

Публикации

Информация

Сайт
wunderfund.io
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
xopxe