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