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

Псевдоним не «переопределяет» записи 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.. ?

решение1

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

решение2

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

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

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

Связанный контент