Wie schalten Sie durch fortlaufend nummerierte Aliase?

Wie schalten Sie durch fortlaufend nummerierte Aliase?

Ich habe 3 Aliase. Sie heißen echo1, echo2, echo3

Wie führe ich alle drei als Teil eines größeren Befehls aus?

$ alias echo1='echo 1'
$ alias echo2='echo 2'
$ alias echo3='echo 3'

$ echo1
1

$ echo2
2

$ echo3
3

$ echo{1..3}
bash: echo1: command not found

$ bash -ic echo{1..3}
echo2: echo1: command not found

$ bash -ic 'echo{1..3}'
bash: echo1: command not found

Lösung: basierend auf Kusalanandas Antwort:

 printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

Antwort1

Aufgrund der Reihenfolge der Auswertung der Dinge echo$iwürde die Zeichenfolge echo1(für i=1) ausgewertet werden.nachAlias-Erweiterung.

Um den String als Alias ​​nutzen zu können, müssen Sie den resultierenden String neu auswerten:

for i in 1 2 3; do
    eval "echo$i"
done

Wenn echo1, echo2und echo3gewesen wäreShell-Funktionen, dann evalwäre das nicht nötig gewesen (getestet in Bash 4.4).

Ihre Versuche mit bash -cwerden nicht funktionieren, da die Aliase lokal für die aktuelle Shell-Sitzung sind.

Ihre erste Sache

echo{1..3}

würde zur Folge haben,

echo1 echo2 echo3

Selbst wenn echo1es zu erweitert worden wäre echo 1, wäre das Ergebnis die Ausgabe der Zeichenfolge gewesen

1 echo2 echo3

Persönlich, je nachdem, was Sie mit den Aliasnamen erreichen wolltenGenau genommentäte, hätte ich eine Funktion implementiert:

dothing () {
    printf '%s\n' "$@"
}

... und dann mit

dothing {1..3}

produzieren

1
2
3

Natürlich hätte man das auch printf '%s\n' {1..3}direkt mit... erreichen können.

Antwort2

Warum nicht eine andere Funktion erstellen, die die Aliase ausführt?

function execute_all_aliases{
  alias1
  alias2
  alias3
}

Antwort3

Sie können immer Folgendes tun:

eval echo{1..3}\;

Das heißt, die Shell soll die Erweiterung als Shell-Code auswerten, das heißt:

echo1; echo2; echo3;

Einige andere Varianten:

eval echo{1..3}$'\n' # separate with newline instead of ;. Can make a
                     # difference for things like alias echo1='echo x|'
                     # alias echo2='tr x y'

eval echo{1..3}'&&' : # only run the next one if the previous one succeeded

Antwort4

Dank @Kusalananda bin ich auf die folgende Lösung gekommen:

printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

Dadurch wird das Ziel erreicht, n Aliase nacheinander mit anderen Befehlsteilen auszuführen

verwandte Informationen