Последняя строка моего .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
alias
bash-alias
javadba
источник
источник
PATH
envar.Ответы:
Команда
which
возвращает только исполняемые файлы: она ничего не знает о псевдонимах, так как она является внешней программой, и механизм передачи информации о псевдониме дочернему процессу отсутствует.Если вы введете команду,
type -a cp
вы увидите все возможные интерпретации в порядке предпочтения. Это включает любой псевдоним, такtype
как являетсяbash
внутренней командой.Важно понимать, что псевдоним не будет интерпретироваться подпроцессом, таким как сценарий или интерактивный редактор, который имеет возможность запускать системные команды.
Если вы создадите
cp
функцию, ваша версия будет работать в скриптах, но не из других программ:Если вы хотите, чтобы ваш
cp
работал везде, добавьте$HOME/bin
в началоPATH
списка и$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, поэтому она может создавать псевдонимы.источник