Останній мій рядок .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 вбудований, тому він може повідомляти про псевдоніми.
PATHenvar.