8

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

2 ответа2

20

Команда 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), но для этого обычно требуются права суперпользователя (sudo ln ...). Создание функции и добавление в переменную PATH будет выполняться в одном из сценариев запуска bash с разрешениями пользователя.

13

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

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

type , с другой стороны, является встроенным в Bash, поэтому может сообщать об алиасах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .