Wie erstelle ich einen Alias, der tatsächlich einen anderen gleichnamigen Alias in Bash erweitert?
Warum:
Früher habe ich mich GREP_OPTIONS
auf .bashrc
so etwas eingestellt:
GREP_OPTIONS="-I --exclude=\*~"
Ich hatte auch ein Skript (sagen wir mal setup-java.sh
), das ich aufrufen würde, bevor ich an einigen Java-Projekten arbeitete. Es würde die Zeile enthalten:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Wenn ich auch Sass benutze, würde ich anrufen, setup-sass.sh
welches die Zeile enthält:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Wurde GREP_OPTIONS
aber veraltet und anscheinend besteht die Standardlösung darin, entweder einen Alias oder ein Skript zu erstellen ...
Antworten:
Bash speichert die Werte von Aliasen in einem Array mit dem Namen
BASH_ALIASES
:Mit der Parametererweiterung können wir entweder den zuletzt eingestellten Alias (falls vorhanden) oder den Standardwert erhalten:
Jetzt mach es einfach auf
setup-java.sh
:... und schließlich auf
setup-sass.sh
:Wenn die drei Zeilen aufgerufen werden, bekommen wir, was wir wollen:
quelle
aliases
Kette, wenn Sie sie mit Leerzeichen beenden.Auf diese Weise können Sie ganze Skripte schreiben, wenn Sie verrückt genug sind. Wenn Sie einen Alias erweitern möchten, stellen Sie einfach sicher, dass der Alias, den Sie erweitern möchten, in einem Leerzeichen endet, und heften Sie einen anderen an.
quelle
exdir
? (Ist das nur für die Ausrichtung aus ästhetischen Gründen?)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 "$@"
. Wenn Sie dies tun,aliases
können Sie die Erweiterungen der Muster direkter und sicherer verwenden. Sie einen zweiten Kontext w / müssen ,eval
wenn innerhalb einer Funktion aufgerufen, aber es ist nicht von Natur aus unsicher, solange diepattern
undlist
Namen , die von Ihnen gesteuert werden . Sie können in den meisten Fällen nur dann brechen, wenn sie es nicht sind, es sei denn, ein Angreifer beendet Ihre wissentlich korrektcase
..bashrc
:alias sudo='sudo '
, damit kann ich alle meine Alias-Befehle nach a aufrufensudo
. Ohne den Platz würde es nicht funktionierenEine Funktion ist hier eine bessere Option als ein erweiterbarer Alias.
Auf diese Weise haben Sie zwei Möglichkeiten, der Umgebung Optionen hinzuzufügen:
Ändern Sie das
grep_options
Array. Dies unterstützt Optionen mit Leerzeichen, Literal-Glob-Zeichen und anderen Eckfällen korrekt:Verwenden Sie die traditionelle
GREP_OPTIONS
skalare Variable trotz ihrer Fallstricke (siehe BashFAQ # 50 , um einige davon zu verstehen):Wenn Sie jedoch möchten, dass Ihre Optionen von
grep
Instanzen reflektiert werden, die außerhalb der Shell aufgerufen werden, sind weder ein Alias noch eine Funktion ausreichend. Stattdessen möchten Sie ein Wrapper-Skript, das früher in Ihrem PATH als der eigentlichegrep
Befehl platziert wird. Zum Beispiel:... und in
~/bin/grep
:quelle