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

1606
javadba

Последняя строка моего .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..?

8
Для записи: технически псевдонимы *** не *** переопределяют любые значения в envar `PATH`. can-ned_food 6 лет назад 1
Обязательное предостережение: как правило, не рекомендуется переименовывать общие команды. Это может укусить вас двумя способами. 1) Если вы работаете в другой системе и используете свою команду по привычке, вы получите неожиданное поведение собственной команды. 2) Если кто-то еще использует вашу систему, даже для того, чтобы посоветовать / помочь вам решить проблему, он получит неожиданное поведение вашей настройки. Пользовательские команды хороши, только не называйте их так же, как общие существующие. Joe 6 лет назад 0
@joe На самом деле здесь все наоборот: * версия * cp * для os / x не имеет опций * nix, поэтому она не ведет себя должным образом (за исключением тех, кому * нравится * версия для hobbled mac) javadba 6 лет назад 0

2 ответа на вопрос

20
AFH

Команда 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сценариев запуска с разрешениями пользователя.

Хотя в CentOS (и AIUI все RedHat) стандартный профиль (если не переопределен) создает _alias_ для `which`, который запускает` / usr / bin / which` с вводом по конвейеру из вывода `alias` и опцией, которая сообщает ему прочитайте этот ввод и используйте его, чтобы показать псевдоним, если он соответствует команде. См. Https://unix.stackexchange.com/questions/10525/how-to-use-which-on-an-aliased-command. dave_thompson_085 6 лет назад 1
@ dave_thompson_085 - Интересный комментарий: я не использовал эти дистрибутивы. Я использую Ubuntu, и я могу получить почти такой же эффект, просто добавив псевдоним `which` к` type`. Затем `which -a` работает как внешняя программа с добавлением псевдонимов и определений функций. В общем, я не `alias which = type`, потому что мне нравится использовать` $ (which ProgName) `, когда я хочу принудительно использовать внешнюю программу, минуя любые определения псевдонимов или функций. AFH 6 лет назад 0
Жесткие ссылки не могут пересекать файловые системы, поэтому несимвольное предложение `ln` будет работать только в том случае, если ваш домашний каталог находится в той же файловой системе, что и` / usr / local / bin`. Это также будет вести себя странно, если вы обновите `gcp`, поскольку ваша жесткая ссылка, вероятно, все еще будет ссылаться на старую версию. Useless 6 лет назад 1
@Useless - допустимые точки, поэтому я отредактировал свой ответ, предложив сначала символическую ссылку, хотя я думаю, что разрешения, вероятно, являются наиболее важным фактором. Что касается обновления `gcp`, это будет зависеть от того, выполняется ли обновление открытием и записью или удалением и повторным созданием. Обратите внимание, что неважно, используется ли абсолютный или относительный исходный путь для создания жесткой ссылки, в то время как символической ссылке обычно нужен абсолютный путь. Ссылки широко используются в ОС, и они в основном символические. AFH 6 лет назад 0
Конечно, псевдонимы могут быть расширены в сценариях, если установлена ​​опция оболочки `expand_aliases`. can-ned_food 6 лет назад 0
@ can-ned_food - это не так просто, как установить его в текущей оболочке: его нужно устанавливать в каждом скрипте вместе с импортом псевдонимов. AFH 6 лет назад 1
@AFH Хороший вопрос. Я делаю все это с помощью моей переменной оболочки `BASH_ENV`. Немного медленно, да, но это дает мне хорошую платформу с меньшим количеством сюрпризов. can-ned_food 6 лет назад 0
13
8bittree

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

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

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

И, кроме того, псевдонимы раскрываются только если первое слово в команде. Может быть, это не имеет отношения. can-ned_food 6 лет назад 2