Jak utworzyć alias, który faktycznie rozszerza inny alias o tej samej nazwie w Bash?
Dlaczego:
Kiedyś GREP_OPTIONS
ustawiłem na .bashrc
coś takiego:
GREP_OPTIONS="-I --exclude=\*~"
Miałem też skrypt (powiedzmy, że setup-java.sh
), który zadzwoniłbym przed pracą nad niektórymi projektami Java. Zawierałby wiersz:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Gdybym również używał Sassa, zadzwoniłbym, setup-sass.sh
który zawiera wiersz:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Ale GREP_OPTIONS
był przestarzały i najwyraźniej standardowym rozwiązaniem jest albo utworzenie aliasu, albo jakiegoś skryptu ...
Odpowiedzi:
Bash przechowuje wartości aliasów w tablicy o nazwie
BASH_ALIASES
:Dzięki rozszerzeniu parametrów możemy uzyskać ostatni ustawiony alias (jeśli istnieje) lub wartość domyślną:
Teraz po prostu zrób to na
setup-java.sh
:... i wreszcie
setup-sass.sh
:Jeśli trzy linie zostaną wywołane, otrzymamy to, czego chcemy:
źródło
aliases
łańcuch, jeśli zakończysz je spacjami.Możesz w ten sposób pisać całe skrypty, jeśli jesteś wystarczająco szalony. W każdym razie, jeśli chcesz przedłużyć alias, po prostu upewnij się, że alias, który chcesz przedłużyć, kończy się spacją i przypnij inny.
źródło
exdir
? (Czy to tylko ze względów estetycznych?)fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"
. Dziękialiases
temu możesz używać rozszerzeń wzorów bardziej bezpośrednio i bezpieczniej. Potrzebujesz drugiego kontekstu w /eval
po wywołaniu z funkcji, ale nie jest to z natury niebezpieczne, o ile Typattern
ilist
nazwy są kontrolowane przez Ciebie. Mogą się złamać tylko w większości przypadków, nawet jeśli tak nie jest, chyba że jakiś atakujący świadomie poprawnie zakończy twojecase
..bashrc
:alias sudo='sudo '
ta pozwala mi nazwać wszystkie moje aliasami poleceń posudo
. Bez miejsca nie działałobyFunkcja jest lepszą opcją niż rozszerzalny alias tutaj.
W ten sposób masz dwie opcje, aby dodać opcje do środowiska:
Zmień
grep_options
tablicę; to poprawnie obsługuje opcje ze spacjami, dosłowne znaki globu i inne przypadki narożne:Użyj tradycyjnej
GREP_OPTIONS
zmiennej skalarnej, pomimo jej pułapek (zobacz BashFAQ # 50, aby zrozumieć niektóre z nich):To powiedziawszy, jeśli chcesz, aby opcje były odzwierciedlane przez
grep
instancje wywoływane poza powłoką, ani alias, ani funkcja nie będą działać. Zamiast tego będziesz chciał umieścić skrypt otoki wcześniej w swojej ŚCIEŻCE niż w prawdziwymgrep
poleceniu. Na przykład:... oraz w
~/bin/grep
:źródło