Псевдонім не "замінює" записи PATH?


9

Останній мій рядок .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..?


1
Для запису: технічно псевдоніми не перекривають жодних значень у PATHenvar.
can-ned_food

Обов’язкова обережність: Взагалі, перейменовувати загальні команди не годиться. Це може вкусити вас двома способами. 1) Якщо ви працюєте в іншій системі і використовуєте свою команду за звичкою, ви отримаєте несподівану поведінку нативної команди. 2) Якщо хтось інший використовує вашу систему, навіть щоб порадити / допомогти вирішити проблему, він отримає несподівану поведінку вашої настройки. Спеціальні команди - це добре, просто не називайте їх так само, як звичайні існуючі.
Джо

@joe Насправді тут більше зворотного : версія OS / x CP не має варіантів від nix, тому вона не веде себе так, як очікувалося (за винятком тих, кому * подобається версія
hobbled

Відповіді:


21

У 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сценаріїв запуску із дозволом користувача.


1
Хоча в CentOS (і AIUI всі RedHat) стандартний профіль (якщо не буде переосмислений) створює псевдонім для whichцього запуску /usr/bin/whichіз вхідним сигналом з виводу aliasта опцію, яка наказує йому прочитати цей вхід і використовувати його, щоб показати псевдонім, якщо він відповідає командування. Дивіться unix.stackexchange.com/questions/10525/…
dave_thompson_085

@ dave_thompson_085 - Цікавий коментар: я не використовував ці дистрибуції. Я використовую Ubuntu, і я можу отримати майже той самий ефект, просто зшивши whichйого type. Потім which -aдіє як зовнішня програма, з додаванням псевдоніму та визначення функцій. Взагалі я цього не роблю alias which=type, тому що мені подобається використовувати, $(which ProgName)коли я хочу змусити використовувати зовнішню програму, минаючи будь-які псевдоніми або визначення функцій.
AFH

1
Жорсткі посилання не можуть перетинати файлові системи, тому несимволічна lnпропозиція працюватиме лише в тому випадку, якщо ваш домашній каталог знаходиться в тій же файловій системі, що і /usr/local/bin. Це також буде поводитись дивно, якщо ви оновите gcp, оскільки ваше жорстке посилання, ймовірно, все ще буде посилатися на стару версію.
Марно

@Useless - Дійсні пункти, що є частиною того, чому я змінив свою відповідь, щоб спершу запропонувати символічне посилання, хоча я думаю, що дозволи, мабуть, є найважливішим. Що стосується оновлення gcp, то це залежатиме від того, чи буде оновлення виконано шляхом відкриття та написання або видаленням та повторним створенням. Зауважте, що неважливо, чи використовується абсолютний або відносний вихідний шлях для створення жорсткого зв’язку, тоді як символічне посилання зазвичай потребує абсолютного шляху. Посилання широко використовуються в ОС, і вони переважно символічні.
AFH

1
@ can-ned_food - Це не так просто, як встановити його в поточній оболонці: він повинен бути встановлений у кожному сценарії разом з імпортом псевдонімів.
AFH

13

Псевдоніми є внутрішніми для оболонки. Інші програми не знають про них.

whichне є вбудованим Bash (це вбудований в деяких інших оболонках, наприклад, zsh). Оскільки whichнемає привілейованої інформації в псевдонімах Баша, він whichпросто розглядає PATHданий термін.

typeЗ іншого боку , це Bash вбудований, тому він може повідомляти про псевдоніми.


2
А також псевдоніми розширюються лише в тому випадку, якщо перше слово в команді. Можливо, це не актуально.
can-ned_food
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.