Alias ​​nie „zastępuje” wpisów ŚCIEŻKI?

9

Ostatnia moja linia .bash_profileto:

alias cp=/usr/local/bin/gcp

Jest to jednak zmiażdżone przez wpis w moim $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

Myślałem, że aliasy zastępują PATH...?

javadba
źródło
1
Dla przypomnienia: technicznie aliasy nie zastępują żadnych wartości w PATHenvar.
can-ned_food
Obowiązkowa przestroga: Zasadniczo zmiana nazwy popularnych poleceń nie jest dobrą praktyką. To może cię ugryźć na dwa sposoby. 1) Jeśli pracujesz w innym systemie i używasz polecenia według przyzwyczajenia, otrzymasz nieoczekiwane zachowanie polecenia natywnego. 2) Jeśli ktokolwiek korzysta z Twojego systemu, nawet w celu doradzenia / pomocy w rozwiązaniu problemu, otrzyma nieoczekiwane zachowanie podczas dostosowywania. Polecenia niestandardowe są w porządku, po prostu nie nazywaj ich tak samo jak zwykłe istniejące.
Joe
@joe Właściwie jest to raczej odwrotność : wersja cp OS / x nie ma opcji z nix, więc nie zachowuje się zgodnie z oczekiwaniami (z wyjątkiem tych, którzy * lubią
spętaną

Odpowiedzi:

21

Te whichpowroty poleceń wykonywalnych tylko: to nic nie wie o aliasów, gdyż jest zewnętrzny program, i nie ma mechanizmu przekazywania informacji alias do procesu potomnego.

Jeśli wpiszesz polecenie type -a cp, zobaczysz wszystkie możliwe interpretacje, w kolejności preferencji. Obejmuje to dowolny alias, ponieważ typejest to bashpolecenie wewnętrzne.

Ważne jest, aby zdawać sobie sprawę, że alias nie będzie interpretowany przez podproces, taki jak skrypt lub interaktywny edytor z opcją uruchamiania poleceń systemowych.

Jeśli utworzysz cpfunkcję, twoja wersja będzie działać w skryptach, choć nie z innych programów:

cp() { /usr/local/bin/gcp "$@"; }

Jeśli chcesz, aby Twoja cppraca była wszędzie, dodaj $HOME/binna początku PATHlisty i $HOME/bin/cpwskaż na nią:

ln -s /usr/local/bin/gcp $HOME/bin/cp

To tworzy dowiązanie symboliczne, chociaż możesz uczynić go nieco bardziej wydajnym dowiązaniem twardym (pomiń -s), ale zwykle wymaga to uprawnień roota ( sudo ln ...). Utworzenie funkcji i dodanie do PATHzmiennej zostanie wykonane w jednym ze bashskryptów startowych, z uprawnieniami użytkownika.

AFH
źródło
1
Chociaż w CentOS (i AIUI wszystkie RedHat) profil standardowy (o ile nie jest przesłonięty) tworzy alias dla whichtego /usr/bin/whichdziałania z danymi wejściowymi wyprowadzonymi z wyjścia aliasi opcją, która nakazuje mu odczytanie tego wejścia i użycie go do wyświetlenia aliasu, jeśli pasuje Komenda. Zobacz unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Ciekawy komentarz: Nie korzystałem z tych dystrybucji. Używam Ubuntu i mogę uzyskać podobny efekt, po prostu aliasing whichdo type. Następnie which -adziała jak program zewnętrzny, z dodatkiem aliasu i definicji funkcji. Zasadniczo nie alias which=type, ponieważ lubię używać, $(which ProgName)gdy chcę wymusić użycie zewnętrznego programu, pomijając wszelkie aliasy lub definicje funkcji.
AFH
1
Dowiązania twarde nie mogą przenikać systemów plików, więc lnsugestia niesymboliczna będzie działać tylko wtedy, gdy katalog domowy znajduje się w tym samym systemie plików co /usr/local/bin. W przypadku aktualizacji zachowa się również dziwnie gcp, ponieważ Twój twardy link prawdopodobnie nadal będzie odnosił się do starej wersji.
Bezużyteczne
@Useless - Prawidłowe punkty, między innymi dlatego zredagowałem moją odpowiedź, aby najpierw zasugerować dowiązanie symboliczne, choć uważam, że uprawnienia są prawdopodobnie najważniejszą kwestią. Jeśli chodzi o aktualizację gcp, będzie to zależeć od tego, czy aktualizacja zostanie wykonana przez otwarcie i napisanie, czy usunięcie i ponowne utworzenie. Zauważ, że nie ma znaczenia, czy bezwzględna czy względna ścieżka źródłowa jest używana do utworzenia twardego łącza, podczas gdy łącze symboliczne zwykle wymaga ścieżki bezwzględnej. Łącza są szeroko stosowane w systemie operacyjnym i są w większości symboliczne.
AFH
1
@ can-ned_food - Nie jest tak proste jak ustawienie go w bieżącej powłoce: musi być ustawione w każdym skrypcie, wraz z importowaniem aliasów.
AFH
13

Aliasy są wewnętrzne dla powłoki. Inne programy nie będą o nich wiedzieć.

whichnie jest wbudowany w Bash (jest wbudowany w inne powłoki, np. zsh). Ponieważ whichnie ma uprzywilejowanych informacji w aliasach Basha, whichpo prostu przegląda PATHpodany termin.

type, z drugiej strony jest wbudowany w Bash, więc może raportować aliasy.

8bittree
źródło
2
Ponadto aliasy są rozwijane tylko wtedy, gdy pierwsze słowo w poleceniu. Może to nie ma znaczenia.
can-ned_food