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
...?
bash
alias
bash-alias
javadba
źródło
źródło
PATH
envar.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 tobash
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:Jeśli chcesz, aby Twoja
cp
praca była wszędzie, dodaj$HOME/bin
na początkuPATH
listy i$HOME/bin/cp
wskaż na nią: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 doPATH
zmiennej zostanie wykonane w jednym zebash
skryptów startowych, z uprawnieniami użytkownika.źródło
which
tego/usr/bin/which
działania z danymi wejściowymi wyprowadzonymi z wyjściaalias
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
dotype
. Następniewhich -a
działa jak program zewnętrzny, z dodatkiem aliasu i definicji funkcji. Zasadniczo niealias 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ż dziwniegcp
, 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ądaPATH
podany termin.type
, z drugiej strony jest wbudowany w Bash, więc może raportować aliasy.źródło