Быстрые ссылки
Иногда можно встретить совет: добавляйте к алиасу полный путь до программы. Но прежде чем делать так по привычке, подумайте — нужно ли вам это на самом деле, и не обернётся ли это неожиданными сложностями при работе?
Что такое алиас?
Алиас — это короткая команда, которая заменяет длинную. Когда вы вводите алиас, оболочка автоматически подставляет заранее заданный текст вместо вашего короткого слова. Это может быть та же команда с нужными опциями или даже совершенно другая команда.
Создать алиас легко с помощью команды alias. Например:
После такой настройки ваш шелл будет заменять указанное_слово (при вводе в начале строки) на тот текст, что находится в кавычках. К примеру, если вы напишете:
Теперь при вводе «ls» всегда будет выполняться «ls -GF».
Алиасы — очень полезная штука: они экономят время, избавляют от долгого набора одних и тех же опций и позволяют сразу запускать программы с нужными параметрами.
Например, недавно я увидел в документации к fd совет: добавить нужные флаги прямо в алиас, чтобы не вводить их каждый раз.
По умолчанию fd скрывает файлы, проигнорированные системой контроля версий. Флаг «--no-ignore-vcs» выключает это поведение, и если он уже зашит в алиас, вам не нужно вспоминать и добавлять его вручную каждый раз.
Но меня удивил пример, где в алиасе был полный путь до программы. Я-то всегда думал, что алиасы работают и без этого, как с ls. Чем же на практике отличается алиас с полным путём?
Что происходит, если в алиасе прописан путь?
На первый взгляд всё просто: оболочка подменяет «fd» на «/usr/bin/fd», и команда работает. Иногда запускать программу по абсолютному пути действительно необходимо — например, если её нет в PATH.
Но есть подвох: как только вы прописываете полный путь, вы полностью обходите переменную PATH. Допустим, fd решили перенести из /usr/bin в /usr/local/bin — и ваш алиас тут же ломается, потому что путь больше не существует.
Выпутаться из такой ситуации обычно несложно, но бывают случаи серьезнее. На одном компьютере может быть установлено несколько версий одной и той же утилиты — в разных папках из PATH. И это довольно частый сценарий:
Например, у меня команда ri есть и в /opt/homebrew/bin, и в /usr/bin. Но из-за порядка в PATH система запускает версию из Homebrew. А если я укажу абсолютный путь к /usr/bin/ri прямо в алиасе?
В этом случае каждый раз будет запускаться только версия из /usr/bin — даже если в другом месте появится более свежая копия. Абсолютный путь в алиасе попросту игнорирует ваш PATH — а ведь многим в Linux он и нужен для гибкости.
А если не указывать путь в алиасе?
Гораздо проще и надёжнее делать алиасы только по имени команды, например:
Такие алиасы «подхватывают» всё, что находится в вашем PATH — система сама решит, какую версию запускать, если вы верно настроили окружение. При этом никто не мешает вам запустить нужную версию явно, просто прописав полный путь вручную:
А что насчёт другой стороны алиаса?
Нужно помнить: алиасы срабатывают только при точном совпадении написания команды. Для шелла есть большая разница между «ls» и «/bin/ls», пусть это и один и тот же файл на диске.
Например, на моей машине ls находится в /bin/ls, и я сделал алиас ls='ls -GF':
Если ввести ls — сработает алиас, и вы увидите файлы с цветными метками:
На самом деле под капотом просто вызывается /bin/ls с нужными опциями. Но если я наберу не «ls», а «/bin/ls», алиас уже не сработает — параметры добавлены не будут:
Всё потому что для оболочки «ls» и «/bin/ls» — это просто разные слова, даже если в итоге запускается одно и то же. Ещё интереснее: можно указать абсолютный путь даже слева в алиасе! Например, alias "/bin/ls"='...'
Для шелла это просто текст, никаких реальных связей с существующим файлом нет. Такой алиас сработает даже если /bin/ls вообще не существует на вашем диске.
Но на практике такие алиасы (например, alias /bin/ls='...') почти бесполезны: их неудобно вводить, и они не добавляют никакого удобства. Основной смысл алиасов как раз в том, чтобы упростить набор команды, а выбор актуальной версии утилиты отдайте на откуп PATH. Хотите перестраховаться и прописать все варианты? Реально всё равно не получится — оболочка думает буквально:
Так какой вариант выбрать?
Самое главное: алиас — это просто замена текста. Это удобно, чтобы добавлять стандартные параметры и сокращать рутину, но изначально алиасы придуманы для работы с клавиатурой, а не для сложного автомата.
Если вам нужно писать shell-скрипты, важно понимать разницу между алиасами, функциями, встроенными командами и знать, что именно вы вызываете под тем или иным именем.
Команда builtin позволяет запустить внешнюю программу, обходя алиасы, функции и внутренние команды шелла. Кроме того, алиас легко обойти: достаточно взять имя команды в кавычки или явно прописать путь до нужной версии:
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru