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...?
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...?
Odpowiedzi:
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.
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/…
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.
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.
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.
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.
PATHenvar.