So funktioniert ein Alias-Hack mit Leerzeichen am Ende mit den angegebenen Parametern

So funktioniert ein Alias-Hack mit Leerzeichen am Ende mit den angegebenen Parametern

Ich habe zwei Aliase watchExpandund l. Ich weiß, dass Sie die Bash-Erweiterung mit Aliasen zum Laufen bringen können, indem Sie am Ende ein Leerzeichen einfügen, wie folgt:

alias watchExpand='watch '

list ein Alias ​​für ls -larthiF --context. Wenn ich den Befehl also eingebe, watchExpand lfunktioniert er einwandfrei.

Wenn ich jedoch einen Parameter für watchExpandden Befehl angebe, z. B.

watchExpand -n 1 l

Mein lAlias ​​funktioniert nicht mehr. Wie kann ich eine Bash-Erweiterung nach Argumenten erhalten?

Antwort1

Hier ist die schlechte Idee, die ichdenkenSie fragen nach:

function watchExpand() {
  e=""
  for param in $@
  do
    if alias $param >/dev/null 2>&1
    then
      exp=$(alias $param | cut -d= -f2| sed -e s/^\'// -e s/\'\$//)
      e+=" $exp"
    else
      e+=" $param"
    fi
  done
  watch $e
}

Antwort2

Zsh hat globale Aliase. Sie könnten Folgendes tun:

alias -g @l='ls -larthiF --context'

und dann:

watch -n 1 @l

Beachten Sie, dass dies @nicht zwingend erforderlich ist, ich verwende es jedoch, um zu vermeiden, dass die globalen Aliase unbeabsichtigt aufgerufen werden.

Antwort3

Ich finde die Lösung auf meine Art.

Zuerst erstelle ich eine Funktion namens „addExpand“, um Alias/Funktionen einfacher hinzuzufügen, wenn ich möchte.

xb@dnxb:/tmp/t$ type -a addExpand
addExpand is a function
addExpand () 
{ 
    echo -e "#!/bin/bash\nshopt -s expand_aliases\n. ~/.bash_aliases 2>/dev/null\n$1"' "$@"' | sudo tee /usr/bin/e_"$1";
    sudo chmod +x /usr/bin/e_"$1"
}
xb@dnxb:/tmp/t$ addExpand l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"

Nachdem ich ausgeführt habe addExpand l, wird Alias l​​als ausführbare Datei mit dem Namen erstellt/usr/bin/e_lmit folgendem Inhalt:

xb@dnxb:/tmp/t$ cat /usr/bin/e_l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"

Nun können Sie die erweiterte Version des Alias/der Funktion nutzen:

xb@dnxb:/tmp/t$ watch --color -n 1 e_l /tmp //works like a charm !!!
xb@dnxb:/tmp/t$ 

Notiz:

[1] e_l, Präfix „e_“, um anzugeben, dass es sich um die erweiterte Version des Befehls handelt.

[2] Ich finde es zu aufwändig, alle Sekunden eine Sourcing-Operation durchzuführen, wenn ich mit arbeite watch -n 1. Ich muss vielleicht einen Weg finden, dieses Problem zu lösen.

[3] Ein weiterer Nachteil ist, dass Aliase nicht rekursiv aufgelöst werden.

verwandte Informationen