W moim .profile
(pochodzącym sh
z mojego trybu emulacji .zshrc
) mam następujący fragment kodu:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
Jednak drugi alias zawsze zastępuje pierwszy:
% type pacman
pacman is an alias for pacman --color auto
Jak mogę to zrobić, aby drugie przypisanie aliasu „dziedziczyło” pierwsze przypisanie, aby, jeśli /usr/bin/pacmatic
istnieje, alias stał się pacmatic --color auto
?
Nie jestem przeciwny używaniu funkcji zamiast aliasów, ale wolałbym, żeby logika nie była wykonywana przy każdym pacman
wywołaniu (chcę pacmatic
sprawdzić raz, przy uruchomieniu powłoki, nie za każdym razem pacman
). Wolałbym także sh
skrypt obsługiwany przez użytkownika, ale jeśli nie jest to możliwe, możesz użyć pełnej zsh
składni.
(Tak, wiem, że można to łatwo rozwiązać, dołączając --color auto
do pacmatic
aliasu. Ale chcę to zrobić we właściwy sposób.)
Próbowałem Googling i przeglądałem strony, ale bezskutecznie.
bash
) i mogą łatwo do siebie dzwonić.Odpowiedzi:
Powłoka
alias
zachowuje się bardzo podobnie do a#define
, tzn. Przedefiniowanie aliasu powłoki zastąpiłoby poprzednią.Nie jestem pewien, jaka byłaby właściwa metoda TM , ale jednym z podejść byłoby użycie funkcji powłoki, która akceptuje parametry i użycie jej do utworzenia aliasu. Twój fragment kodu można przepisać jako:
Co więcej, nawet jeśli używasz różnych aliasów i próbujesz użyć jednego do zdefiniowania drugiego, nie zadziała, ponieważ aliasy nie są domyślnie rozwijane w trybie nieinteraktywnym. Musisz go włączyć, ustawiając
expand_aliases
:Cytowanie z instrukcji:
źródło
type pacman
zwracapacman is an alias for pacman --color auto
zarówno wsh
trybie emulacji , jak iw trybie macierzystymzsh
. Wygląda jednak na to, że właśnie dokonana edycja jest tym, czego potrzebuję.setopt aliases
.zsh
. A i tak wydaje się, że powłoka jest interaktywna.Podstawienie aliasu jest wykonywane tylko podczas odczytywania wierszy ze źródeł interaktywnych. Zatem na drugi alias nie ma wpływu pierwszy, stąd dosłowne zastąpienie.
Być może coś podobnego:
Spowoduje to ustawienie właściwej wartości „pacman”, zmienna PACMAN env nie jest eksportowana, więc zniknie po zakończeniu skryptu, a użycie „podwójnych cudzysłowów” zapewni, że podstawienie zmiennej nastąpi przy deklaracji aliasu, nie dla każdego wywołania.
Używam podobnej metody:
Zasadniczo ustaw env var PACMAN, przetestuj ścieżkę pacmatic w ścieżce, jeśli znaleziono, ustaw PACMAN, a następnie zdefiniuj alias.
Hmm, możesz zoptymalizować trochę więcej ...
Taa Daa! Ustaw na „pacman”, jeśli PACMAN jest rozbrojony lub zerowy, w przeciwnym razie ustaw na wartość PACMAN, ustaw na pacmatic przez linię „która”.
źródło
bash
nie rozwija aliasów w trybie nieinteraktywnym, ale jak to się dzieje z „źródłami interaktywnymi”?W zsh możesz łatwo dołączyć do aliasu, używając
aliases
tablicy asocjacyjnej:W innych powłokach musisz użyć danych wyjściowych
alias
polecenia, aby dowiedzieć się o istniejących aliasach.Chociaż oferuję to jako możliwość, wybrałbym zmienną, jak już sugerują inne odpowiedzi. Jest jaśniejsze i można rozróżniać na podstawie wartości zmiennej, jeśli chcesz skonfigurować pewne rzeczy inaczej, na podstawie których jedna
pacmatic
lubpacman
jest w użyciu.źródło
Krótka wersja drugiego aliasu to:
źródło
Aliasy są dla ptaków.
źródło