/ / Erstellen Sie Aliase dynamisch - Bash, Shell, Bash-Scripting, Alias

Erstellen Sie Aliase dynamisch - Bash, Shell, Bash-Scripting, Alias

Ich möchte Aliase basierend auf einem Befehl, seinen Unterbefehlen und seinen Optionen erstellen. Ich möchte, dass der Alias ​​die Abkürzung für diese Komponenten ist.

Dies lässt sich am realen Beispiel einfacher erklären:

alias mc="mvn compile"
alias mt="mvn test"
alias mp="mvn package"
alias mi="mvn install"

alias mcc="mvn clean compile"
alias mct="mvn clean test"
alias mcp="mvn clean package"
alias mci="mvn clean install"

alias mcco="mvn clean compile --offline"
alias mcto="mvn clean test --offline"
alias mcpo="mvn clean package --offline"
alias mcio="mvn clean install --offline"

Ich versuche also, eine Funktion zum Erstellen von Aliasen zu erstellen, ohne alle diese Befehle kopieren und einfügen zu müssen, wenn ich einen neuen Unterbefehl wie hinzufügen möchte validate Es sollte einfach sein, die relativen Aliase zu erstellen (mv, mcv, mcvo) oder dasselbe mit einer neuen Option wie --debug (mccd, mctd, mcpd, mcid).

Ich habe versucht, etwas wie:

m="mvn "
c="clean "
p="package "
"`$m$c$p`" # doesn"t work

Antworten:

1 fĂĽr Antwort â„– 1

Sei vorsichtig dabei.

Hinzufügen eines validate Befehl hier erstellt ein mv alias, das beschatten mv Befehl zum Verschieben von Dateien. Möglicherweise stoßen Sie auf andere Namenskonflikte. Meine unten stehende Lösung bietet einen gewissen Schutz, aber es hilft nichts, wenn Sie einen Alias ​​definieren und dann eine ausführbare Datei mit demselben Namen zu Ihrer hinzufügen $PATH danach. Wenn Sie den Befehl beim Ausführen in Anführungszeichen setzen (z. "mv"), die eine Aliaserweiterung verhindert und den eigentlichen Befehl ausführt, nicht den Alias.

Auf zur Lösung:

Sie können es zuschneiden, indem Sie die Befehle durchlaufen und nur einen Alias-Befehl pro Option festlegen. Um im laufenden Betrieb weitere Alias-Sets hinzuzufügen, können Sie die Befehle in eine Funktion einfügen:

gen_aliases() {
local cmd="${1:?No command to create aliases for.}"
local c=${cmd:0:1}
which -s m${c} || alias m${c}="mvn $cmd"
which -s mc${c} || alias mc${c}="mvn clean $cmd"
which -s mc${c}o || alias mc${c}o="mvn clean $cmd --offline"
}

for cmd in compile test package install; do
gen_aliases "$cmd"
done

${parameter:?word} ist eine Parametererweiterung, die schreibt word auf Standardfehler und beendet die Funktion oder das Skript, wenn parameter ist nicht gesetzt oder null. Bietet uns eine ĂśberprĂĽfung der Vernunft, um sicherzustellen, dass wir keine Aliase erstellen, wenn uns kein Befehl erteilt wurde, dies zu tun.

${parameter:offset:length} ist eine Parametererweiterung, die auf erweitert wird length Zeichen von $parameter beginnt um offset, so ${cmd:0:1} gibt uns den ersten Charakter von $cmd.

which word prĂĽft ob word existiert ĂĽberall in $PATH. Das -s Bringt es zum Schweigen, so dass wir nur den Ausgangswert erhalten (0 wenn gefunden, 1 wenn nicht gefunden), die wir dann mit verwenden || um das auszufĂĽhren alias Befehle nur wenn which tat nicht finden word im $PATH.

ĂśberprĂĽfen der Ergebnisse:

$ type mc
mc is aliased to `mvn compile"
$ type mcpo
mcpo is aliased to `mvn clean package --offline"

Und eine weitere Gruppe von Aliasen hinzufĂĽgen:

$ gen_aliases validate
$ type mv
mv is /bin/mv
$ type mcv
mcv is aliased to `mvn clean validate"