Ostatnia moja linia .bash_profile
to:
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_profile
to:
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 which
powroty 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ż type
jest to bash
polecenie 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 cp
funkcję, twoja wersja będzie działać w skryptach, choć nie z innych programów:
cp() { /usr/local/bin/gcp "$@"; }
Jeśli chcesz, aby Twoja cp
praca była wszędzie, dodaj $HOME/bin
na początku PATH
listy i $HOME/bin/cp
wskaż 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 PATH
zmiennej zostanie wykonane w jednym ze bash
skryptów startowych, z uprawnieniami użytkownika.
which
tego /usr/bin/which
działania z danymi wejściowymi wyprowadzonymi z wyjścia alias
i 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/…
which
do type
. Następnie which -a
dział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.
ln
sugestia 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ć.
which
nie jest wbudowany w Bash (jest wbudowany w inne powłoki, np. zsh). Ponieważ which
nie ma uprzywilejowanych informacji w aliasach Basha, which
po prostu przegląda PATH
podany termin.
type
, z drugiej strony jest wbudowany w Bash, więc może raportować aliasy.
PATH
envar.