Последняя строка моего .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..?
Последняя строка моего .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..?
Ответы:
Команда 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сценариев запуска с разрешениями пользователя.
whichчто бежит /usr/bin/whichс входом по трубопроводу из выхода aliasи вариант , который указывает ему , что вход и использовать его , чтобы показать псевдоним , если он соответствует команда. См unix.stackexchange.com/questions/10525/...
whichк type. Затем which -aработает как внешняя программа с добавлением псевдонимов и определений функций. Обычно я этого не делаю alias which=type, потому что люблю использовать, $(which ProgName)когда хочу принудительно использовать внешнюю программу, минуя определения псевдонимов или функций.
lnпредложение будет работать, только если ваш домашний каталог находится в той же файловой системе, что и /usr/local/bin. Он также будет вести себя странно, если вы обновитесь gcp, поскольку ваша жесткая ссылка, вероятно, все еще будет ссылаться на старую версию.
gcp, это будет зависеть от того, выполнено ли обновление путем открытия и записи или путем удаления и повторного создания. Обратите внимание, что неважно, используется ли абсолютный или относительный исходный путь для создания жесткой ссылки, в то время как символической ссылке обычно нужен абсолютный путь. Ссылки широко используются в ОС, и они в основном символические.
Псевдонимы являются внутренними для оболочки. Другие программы не будут знать о них.
whichне является встроенным в Bash (это встроенный в некоторых других оболочках, например, zsh). Так whichкак не имеет привилегированной информации в псевдонимах Bash, whichпросто просматривает PATHданный термин.
typeс другой стороны , это встроенная функция Bash, поэтому она может создавать псевдонимы.
PATHenvar.