Псевдоним не переопределяет записи PATH?


9

Последняя строка моего .bash_profile:

alias cp=/usr/local/bin/gcp

Однако это подавляется записью в моем $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

Я думал, что псевдонимы перекрывают PATH..?


1
Для записи: технически псевдонимы не переопределяют никакие значения в PATHenvar.
can-ned_food

Обязательное предостережение: как правило, не рекомендуется переименовывать общие команды. Это может укусить вас двумя способами. 1) Если вы работаете в другой системе и используете свою команду по привычке, вы получите неожиданное поведение собственной команды. 2) Если кто-то еще использует вашу систему, даже для того, чтобы посоветовать / помочь вам решить проблему, он получит неожиданное поведение вашей настройки. Пользовательские команды хороши, только не называйте их так же, как общие существующие.
Джо

@joe На самом деле здесь все наоборот : в версии cp для os / x отсутствуют опции от nix, поэтому она не ведет себя
должным образом

Ответы:


21

Команда whichвозвращает только исполняемые файлы: она ничего не знает о псевдонимах, так как она является внешней программой, и механизм передачи информации о псевдониме дочернему процессу отсутствует.

Если вы введете команду, type -a cpвы увидите все возможные интерпретации в порядке предпочтения. Это включает любой псевдоним, так typeкак является bashвнутренней командой.

Важно понимать, что псевдоним не будет интерпретироваться подпроцессом, таким как сценарий или интерактивный редактор, который имеет возможность запускать системные команды.

Если вы создадите cpфункцию, ваша версия будет работать в скриптах, но не из других программ:

cp() { /usr/local/bin/gcp "$@"; }

Если вы хотите, чтобы ваш cpработал везде, добавьте $HOME/binв начало PATHсписка и $HOME/bin/cpукажите на него:

ln -s /usr/local/bin/gcp $HOME/bin/cp

Это делает символическую ссылку, хотя вы можете сделать ее несколько более эффективной жесткой ссылкой (опустите -s), но для этого обычно требуются права доступа root ( sudo ln ...). Создание функции и добавление в PATHпеременную будет выполнено в одном из bashсценариев запуска с разрешениями пользователя.


1
Хотя на CentOS (и AIUI все RedHat) стандартного профиля (если переопределяется) создает псевдоним для того, whichчто бежит /usr/bin/whichс входом по трубопроводу из выхода aliasи вариант , который указывает ему , что вход и использовать его , чтобы показать псевдоним , если он соответствует команда. См unix.stackexchange.com/questions/10525/...
dave_thompson_085

@ dave_thompson_085 - Интересный комментарий: я не использовал эти дистрибутивы. Я использую Ubuntu , и я могу получить такой же эффект, просто альясинга whichк type. Затем which -aработает как внешняя программа с добавлением псевдонимов и определений функций. Обычно я этого не делаю alias which=type, потому что люблю использовать, $(which ProgName)когда хочу принудительно использовать внешнюю программу, минуя определения псевдонимов или функций.
AFH

1
Жесткие ссылки не могут пересекать файловые системы, поэтому несимвольное lnпредложение будет работать, только если ваш домашний каталог находится в той же файловой системе, что и /usr/local/bin. Он также будет вести себя странно, если вы обновитесь gcp, поскольку ваша жесткая ссылка, вероятно, все еще будет ссылаться на старую версию.
бесполезно

@Useless - допустимые точки, поэтому я отредактировал свой ответ, предложив сначала символическую ссылку, хотя я думаю, что разрешения, вероятно, являются наиболее важным фактором. Что касается обновления gcp, это будет зависеть от того, выполнено ли обновление путем открытия и записи или путем удаления и повторного создания. Обратите внимание, что неважно, используется ли абсолютный или относительный исходный путь для создания жесткой ссылки, в то время как символической ссылке обычно нужен абсолютный путь. Ссылки широко используются в ОС, и они в основном символические.
AFH

1
@ can-ned_food - это не так просто, как установить его в текущей оболочке: его нужно устанавливать в каждом скрипте вместе с импортом псевдонимов.
AFH

13

Псевдонимы являются внутренними для оболочки. Другие программы не будут знать о них.

whichне является встроенным в Bash (это встроенный в некоторых других оболочках, например, zsh). Так whichкак не имеет привилегированной информации в псевдонимах Bash, whichпросто просматривает PATHданный термин.

typeс другой стороны , это встроенная функция Bash, поэтому она может создавать псевдонимы.


2
И, кроме того, псевдонимы раскрываются только если первое слово в команде. Может быть, это не имеет отношения.
can-ned_food
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.