Почему не стоит использовать полный путь в ваших алиасах Linux
Перейти по ссылкам
- Что такое псевдоним?
- Что делает псевдоним с путём?
- А как насчёт псевдонима без пути?
- А как насчёт другой половины псевдонима?
- Итак, какой мне использовать?
Иногда вы можете встретить советы, предлагающие использовать полные пути в ваших псевдонимах. Остановитесь на мгновение. Действительно ли это то поведение, которое вы хотите, и как вы можете об этом даже решить?
Что такое псевдоним?
Псевдоним — это более короткий способ ввода команды. Когда вы используете псевдоним, ваша оболочка заменяет его на заранее определённый текст, который может добавлять аргументы или полностью запускать другую команду.
Вы можете создать псевдоним, используя команду alias следующим образом:
alias word="command"
После того как вы создадите такой псевдоним, ваша оболочка заменит word (в начале команды) на полное содержимое двойных кавычек. Например, если вы выполните:
alias ls="ls -GF"
Тогда всякий раз, когда вы будете набирать «ls», вы будете получать «ls -GF» вместо этого.
Псевдонимы действительно полезны, потому что они могут сэкономить ваше время и упростить длинные команды. Они также могут помочь вам настроить работу программ, изменяя их значения по умолчанию.
Например, недавно я наткнулся на совет в руководстве fd о том, как передавать флаги программе с помощью псевдонима:
alias fd="/usr/bin/fd --no-ignore-vcs"
По умолчанию программа фильтрует файлы, которые игнорируются системами контроля версий. Флаг «—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 имеет приоритет. Однако алиас с абсолютным путем может вызвать проблемы:
alias ri="/usr/bin/ri -f markdown"
Команда ri теперь всегда будет запускать версию из /usr/bin, даже если позже будет установлена версия в каталоге homebrew или где-либо еще. Фактически, использование полного абсолютного пути в вашем alias нарушает систему PATH, которая является одним из великих преимуществ Linux.
А как насчёт псевдонима без пути?
Вместо полного пути вы можете — и должны — использовать только имя команды. Например:
alias fd="fd --no-ignore-vcs" alias ls="ls -GF" alias ri="ri -f markdown"
Эти псевдонимы будут учитывать системный PATH и запускать наиболее подходящую команду, при условии, что ваш PATH настроен правильно. Более того, вы всё равно сможете легко их переопределять. Чтобы обойти псевдоним и/или использовать конкретную версию команды, просто выполните её через абсолютный путь:
/usr/bin/ri
А как насчёт другой половины псевдонима?
Если вы немного экспериментировали с псевдонимами и путями, вы могли заметить, что они зависят от того, как вы выполняете команду. Псевдонимы очень буквальны и применяются только тогда, когда они точно совпадают с тем, что вы вводите, а не только тогда, когда они соответствуют выполняемой вами команде.
Например, в моей системе команда ls находится по пути /bin/ls, и у меня есть псевдоним ls=’ls -GF’:
Запуск команды ls выполняет этот алиас, поэтому вывод цветной, и типы файлов указаны:
За кулисами выполняется исполняемый файл /bin/ls; он просто получает эти параметры в качестве аргументов. Однако прямой запуск /bin/ls делает не то же самое:
Это просто потому, что ls буквально не равен строке /bin/ls, даже если это один и тот же файл. Что может вас ещё больше удивить, так это то, что абсолютно нормально указывать полный путь и в левой части alias:
alias /bin/ls="ls -GF"
Что касается оболочки, то «/bin/ls» на самом деле не является путем; это просто строка для сопоставления. Нет никакой связи между этой строкой и фактическим файлом по этому пути; для существования такого алиаса даже не обязательно, чтобы /bin/ls существовал.
Конечно, нет никакой реальной причины создавать такой алиас для /bin/ls. Алиасы должны быть короткими и легко набираемыми, а система PATH позволяет вам не вводить полный путь команды с самого начала. Вы могли бы попытаться предусмотреть все варианты, чтобы ls всегда запускался с определёнными опциями, но вы никогда не сможете учесть все возможности:
Итак, что мне использовать?
Помните, что псевдонимы немного похожи на макросы: это простой механизм поиска и замены. Хотя вы можете использовать их для предоставления значений по умолчанию, имейте в виду, что у них есть определённая область действия: для интерактивного использования из командной строки.
Если вы пишете shell-скрипт, нужно учитывать множество вещей: псевдонимы, функции оболочки, встроенные команды и многое другое. Убедитесь, что вы знаете, какие из них вы собираетесь выполнить, а какие будут выполнены на самом деле.
Встроенная команда command всегда запускает программу, обходя любые функции, встроенные команды или алиасы, которые могут существовать. Аналогично, вы можете обходить алиасы, заключая вашу команду в кавычки любым допустимым способом:
pwd "pwd" 'pwd'






Добавить комментарий