Если вы повторяете одну короткую команду в Терминале на Mac, псевдонима может быть достаточно. Если задаче требуются аргументы, несколько шагов, ветвления или выполнение вне интерактивной оболочки, напишите скрипт. Для промежуточного случая — особенно для команды, которой нужны аргументы, но которая должна менять каталог текущей оболочки — рассмотрите функцию zsh. Это руководство поможет сделать выбор исходя из того, что должна делать команда и где она должна работать.

Что делает псевдоним (alias) в macOS

Псевдоним (alias) — это короткое имя, которое zsh разворачивает в текст команды по мере ввода. Например, если вы часто выполняете git status, можно добавить alias gs='git status' в ~/.zshrc. Apple указывает zsh в качестве стандартной оболочки Терминала, однако оболочку на Mac можно изменить, поэтому проверьте свои настройки, если псевдоним работает не так, как ожидалось. Руководство Apple по Терминалу

Используйте псевдоним, когда подстановка по сути фиксирована: более короткое написание, стандартный параметр или простая команда, которую вы запускаете в интерактивном режиме. Его легко изменить или удалить, и при просмотре определения видно всё действие целиком. В zsh псевдонимы не принимают аргументы в качестве параметров; они являются текстовыми заменами. Поэтому псевдоним плохо подходит, если в действие нужно передать путь или другое изменяющееся значение. Руководство пользователя Zsh по псевдонимам

Псевдонимы также привязаны к парсингу и запуску оболочки. Определение, загруженное из ~/.zshrc, работает в интерактивном сеансе Терминала, но не стоит рассчитывать, что другая программа, неинтерактивная оболочка или скрипт прочитают этот файл и распознают псевдоним. Если команду требуется надежно вызывать из различных контекстов, используйте скрипт или другой явно заданный интерфейс команд.

Когда лучше подходит скрипт

Выбирайте скрипт, когда повторяющаяся задача представляет собой небольшую процедуру, а не фиксированную команду. Признаки этого: наличие нескольких шагов, аргументов, проверок, ветвлений, четкого поведения при успехе или сбое, а также необходимость вызывать задачу по пути или из другого инструмента. Apple описывает скрипты оболочки как способ объединять инструменты командной строки, обрабатывать аргументы и принимать решения на основе кодов возврата. Скрипты оболочки также имеют различия в диалектах, поэтому выбирайте и документируйте интерпретатор, а не предполагайте, что любая оболочка понимает один и тот же синтаксис. Введение в написание скриптов оболочки от Apple

Например, если процедура принимает папку проекта в качестве входных данных, проверяет ее существование, а затем выполняет там одну и ту же последовательность действий, скрипт позволяет сделать эти входные данные явными и выстроить шаги в понятном порядке. Прежде чем автоматизировать такие изменения, как удаление или перезапись файлов, добавьте проверки и четко определите логику поведения при сбоях. Скрипт оболочки запускается как команда в собственном контексте выполнения; не следует рассчитывать на то, что смена каталога внутри него изменит каталог вызвавшей его оболочки Терминала. В документации Zsh выполнение команд скрипта описывается отдельно от выполнения функций в вызывающей оболочке. Выполнение команд в Zsh

Скрипт не становится автоматически безопаснее или портативнее. Это еще один файл, который нужно поддерживать, и его поведение зависит от интерпретатора, доступных на Mac команд, прав доступа и предположений о путях или входных данных. В руководстве Apple отдельно подчеркивается, что различия в диалектах оболочек и утилитах разных платформ могут приводить к ошибкам. Делайте скрипты узкоспециализированными, заключайте подстановки переменных в кавычки там, где это необходимо, и тестируйте их на безопасных тестовых данных перед применением к важной информации.

Используйте функцию zsh для промежуточных случаев

Функция зачастую является лучшим выбором, если вам нужна повторно используемая логика и аргументы в текущей оболочке Терминала, но отдельный файл не требуется. Например, функция может принимать путь к каталогу в качестве аргумента, проверять его и затем выполнять переход с помощью cd; поскольку функции zsh выполняются в процессе оболочки вызывающей стороны, эта смена каталога сохраняется в интерактивном сеансе. В документации Zsh указано, что функции принимают аргументы и выполняются в том же процессе, что и вызывающая сторона. Функции Zsh

Определяйте функцию в ~/.zshrc, если хотите, чтобы она была доступна в интерактивных сеансах Терминала. Отдавайте предпочтение скрипту, если действие должно работать как отдельная команда, вызываться инструментами или другими скриптами, или если им нужно проще делиться в виде файла. Выбирайте псевдоним, если все, что вам нужно, — это легко запоминающееся имя для одной фиксированной командной строки.

Быстрый тест для принятия решения

Спросите себя, что изменится при повторном запуске задачи. Если ничего не меняется, кроме имени команды, используйте псевдоним. Если значение меняется каждый раз (например, папка или имя файла), используйте функцию или скрипт, принимающие его. Если задача содержит последовательность шагов или ветвления, используйте скрипт. Если она должна изменить текущий сеанс Терминала (например, его рабочий каталог), используйте функцию.

Затем проверьте, где именно нужна команда. Только в Терминале? Подойдет псевдоним или функция в ~/.zshrc. Отдельно вызываемая команда? Используйте скрипт с подходящим интерпретатором и продуманными правами доступа. Будет использоваться на другом Mac? Задокументируйте требования и необходимые инструменты; скрипт оболочки не становится автоматически переносимым только потому, что он запускается в Терминале.

Главная разделительная линия — это интерфейс задачи: псевдонимы переименовывают фиксированный текст команды, функции добавляют повторно используемую логику внутри текущей оболочки, а скрипты оформляют процедуру в виде отдельной команды. Начните с самого простого варианта, отвечающего этим требованиям, и переходите к функции или скрипту, когда из-за аргументов, логики или места запуска команды использовать псевдоним становится неудобно.

Источники