Последняя строка моего .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, поэтому она может создавать псевдонимы.
PATH
envar.