Последняя строка моего .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, позволяющая создавать отчеты о псевдонимах.