Z podręcznika bash
Zasady dotyczące definiowania i używania aliasów są nieco mylące. Bash zawsze czyta co najmniej jeden pełny wiersz danych wejściowych przed wykonaniem dowolnego polecenia w tym wierszu. Aliasy są rozszerzane po odczytaniu polecenia, a nie podczas jego wykonywania. Dlatego definicja aliasu pojawiająca się w tym samym wierszu, co inne polecenie, nie obowiązuje, dopóki nie zostanie odczytany następny wiersz danych wejściowych. Nowy alias nie wpływa na polecenia następujące po definicji aliasu w tym wierszu. To zachowanie jest również problemem podczas wykonywania funkcji. Aliasy są rozszerzane, gdy odczytywana jest definicja funkcji, a nie podczas wykonywania funkcji , ponieważ sama definicja funkcji jest poleceniem złożonym. W konsekwencji, aliasy zdefiniowane w funkcji są dostępne dopiero po wykonaniu tej funkcji . Dla bezpieczeństwa zawsze umieszczaj definicje aliasów w osobnym wierszu i nie używaj aliasu w poleceniach złożonych.
Dwa zdania „Aliasy są rozszerzane, gdy odczytywana jest definicja funkcji, a nie podczas wykonywania funkcji” oraz „Aliasy zdefiniowane w funkcji są dostępne dopiero po wykonaniu tej funkcji” wydają się być sobie przeciwne.
Czy potrafisz wyjaśnić, co one oznaczają?
.bashrc
plikach na samej górze.Odpowiedzi:
Aliasy są rozszerzane po odczytaniu definicji funkcji, a nie po uruchomieniu funkcji…
Mimo że
myfunc
został zdefiniowany do wywołaniamyalias
, a ja przedefiniowałemmyalias
,myfunc
nadal wykonuje oryginalną definicjęmyalias
. Ponieważ alias został rozwinięty podczas definiowania funkcji. W rzeczywistości powłoka nie pamięta jużmyfunc
wywołańmyalias
; wie tylko, żemyfunc
wzywacat
:… Aliasy zdefiniowane w funkcji są dostępne dopiero po wykonaniu tej funkcji.
myalias
Alias nie jest dostępna ażmyfunc
funkcja została wykonana. (Wydaje mi się, że byłoby dość dziwne, gdyby zdefiniowanie funkcji definiującej alias wystarczyło do zdefiniowania aliasu).źródło
Potrzebuję odpowiedzi, która jest podana w pierwszym zdaniu, gdy próbuję poniżej fragmentu kodu w moim
.bashrc
.po
unalias -a; source ~/.bashrc
, próbuję wykonaćlf
ilsf
,wydaje się wyraźnie, że aliasy są rozszerzane przy definicji funkcji, a nie przy wykonywaniu funkcji, ponieważ :
lf
, błąd-bash: ll: command not found
ilsf
,/usr/bin/ls
jest używana, nie forma aliasu, brak podświetlenia koloru i brak znaków kontrolnych po pliku wykonywalnym.źródło