Erstellen Sie dynamisch Aliase

1097
Andrea Bergonzo

Ich möchte Aliase erstellen, die auf einem Befehl, seinen Unterbefehlen und seinen Optionen basieren. Ich möchte, dass der Alias ​​das Akronym dieser Komponenten ist.

Dies ist einfacher am realen Beispiel zu 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" 

Also ich versuche, eine Funktion zu erstellen Aliase zu erstellen, ohne Paste kopieren zu müssen dies alle Befehle, wenn ich einen neuen Unterbefehl hinzufügen möchten, wie validatees sollte einfach sein, die relativen Aliase (zu erstellen mv, mcv, mcvo) oder die gleiche Sache mit einer neuen Option wie --debug( mccd, mctd, mcpd, mcid).

Ich habe so etwas ausprobiert:

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

1 Antwort auf die Frage

0
8bittree

Seien Sie vorsichtig, dies zu tun.

Wenn Sie hier einen validateBefehl hinzufügen, wird ein mvAlias ​​erstellt, der den mvBefehl zum Verschieben von Dateien anzeigt. Sie können in andere Namenskonflikte geraten. Meine Lösung bietet einen gewissen Schutz, aber es hilft nicht, wenn Sie einen Alias ​​definieren und anschließend eine ausführbare Datei mit demselben Namen hinzufügen $PATH. Wenn Sie den Befehl bei der Ausführung angeben (z. B. "mv"), verhindert dies die Aliaserweiterung und führt den tatsächlichen Befehl aus, nicht den Alias.

Auf zur Lösung:

Sie können ihn abschneiden, indem Sie die Befehle übergehen und pro Optionssatz nur einen Alias-Befehl verwenden. Um weitere Alias-Sets schnell hinzuzufügen, können wir die Befehle in eine Funktion einfügen:

gen_aliases() { local cmd="$" local c=$ which -s m$ || alias m$="mvn $cmd" which -s mc$ || alias mc$="mvn clean $cmd" which -s mc$o || alias mc$o="mvn clean $cmd --offline" }  for cmd in compile test package install; do gen_aliases "$cmd" done 

$ist eine Parametererweiterung, die wordin den Standardfehler schreibt und die Funktion oder das Skript beendet, wenn sie parameternicht festgelegt oder null ist. Verleiht uns einige Überprüfungen, um sicherzustellen, dass wir keine Aliasnamen erstellen, wenn wir keinen Befehl erhalten haben, für den dies getan wird.

$ist eine Parametererweiterung, die auf lengthZeichen von $parameterBeginn an erweitert wird offset, also $den ersten Buchstaben von $cmd.

which wordüberprüft, ob wordexistiert überall in $PATH. Die -sStille es, so bekommen wir nur den Exit - Wert ( 0falls gefunden, 1wenn nicht gefunden), die wir dann mit verwenden, ||die zur Ausführung aliasBefehle nur dann, wenn whichhaben nicht finden wordin $PATH.

Überprüfung der Ergebnisse:

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

Und einen weiteren Satz von Aliasen hinzufügen:

$ gen_aliases validate $ type mv mv is /bin/mv $ type mcv mcv is aliased to `mvn clean validate' 
Vielen Dank! Danke auch für die Warnung vor dem Umbenennen von 'mv'. Gibt es eine Möglichkeit, programmgesteuert zu überprüfen, ob der Aliasbefehl einen Systembefehl oder einen anderen Alias ​​spiegelt? Andrea Bergonzo vor 6 Jahren 0
@AndreaBergonzo Mit "which foo" können Sie überprüfen, ob "foo" in "$ PATH" vorhanden ist. Ich habe meine Antwort bearbeitet, um das zu demonstrieren, und ich habe die Dinge in eine Funktion verschoben, um sie noch komfortabler zu machen. 8bittree vor 6 Jahren 0
Tolle! Vielen Dank für die Bearbeitung! Andrea Bergonzo vor 6 Jahren 0
Übrigens, auch wenn -s es zum Schweigen bringt, erhalte ich beim Nachladen der Shell Meldungen über alle Aliase. Andrea Bergonzo vor 6 Jahren 0