
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$i
wü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
, echo2
und echo3
gewesen wäreShell-Funktionen, dann eval
wäre das nicht nötig gewesen (getestet in Bash 4.4).
Ihre Versuche mit bash -c
werden 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 echo1
es 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