Останній мій рядок .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
), але для цього зазвичай потрібні кореневі дозволи ( 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
немає привілейованої інформації в псевдонімах Баша, він which
просто розглядає PATH
даний термін.
type
З іншого боку , це Bash вбудований, тому він може повідомляти про псевдоніми.
PATH
envar.