
Ich habe einen Alias wie diesen definiert:
alias xyz='command1; command2'
Ich möchte die Ausgabe eines anderen Befehls (pqr) an command2 weiterleiten, wie:
pqr | xyz -f -
Ist das möglich? Wie kann ich das erreichen?
Antwort1
Die Verwendung eines Alias ist im Allgemeinennichtbewährte Vorgehensweise bei nicht-interaktiven Shell-Skripten (BashFAQ/080). So wie Sie den Alias in Ihrem OP definiert haben, liest nur der erste Befehl von der Standardeingabe, weil ;
Ihre Standardeingabe dadurch nicht über Ihren ersten Befehl hinausgeht.
Eine Möglichkeit besteht darin, eine Befehlsgruppierung mithilfe von durchzuführen {..}
, sodass alle Umleitungen für den gesamten Befehlssatz innerhalb der Gruppe gelten. Sie können Ihre alias
Definition beibehalten und
alias xyz='{ command1; command2; }'
In diesem Fall comamnd1
erhältst du unnötigerweise eine Kopie der Standardeingabe. Du kannst sie schließen, indem du
alias xyz='{ command1 < /dev/null ; command2 - ; }'
Oder verwenden Sie Funktionen, um Ihre Befehle darin zu definieren.
xyz() {
command1; command2
}
Wenn Ihre Shell bash
Prozesssubstitution zsh
unterstützt, können Sie einfach festlegen, command2
dass der Standardeingabeinhalt als Positionsargumente empfangen werden soll. Definieren Sie Ihre Funktion neu als
xyz() {
command1
command2 "$@"
}
und rufen Sie dann Ihren Befehl ( pqr
) auf als
xyz < <(pqr)
Eine einfache Demonstration des oben Gesagten,
zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food) #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood
Antwort2
Ich schlage vor, dass Sie den xargs-Ansatz versuchen, also:
alias xyz='command1; command2 | xargs pqr'
Dies entspricht der Ausführung pqr
mit command2
als Eingabeargument.
Antwort3
So übergeben Sie etwas an die Standardeingabe command2
in der Befehlsliste
command1; command2
Sie müssen sicherstellen, dass command1
nicht von der Standardeingabe gelesen wird. Dies könnte durch Umleiten der Standardeingabe von /dev/null
nach command1
: erfolgen.
command1 </dev/null; command2
Damit bleibt der Alias
alias xyz='command1 </dev/null; command2`
was Sienichtanrufen können mit
pqr | xyz -f -
denn das wäre gleichbedeutend mit
pqr | command1 </dev/null; command2 -f -
Das ist dasselbe wie
pqr | command1 </dev/null
command2 -f -
Definieren Sie stattdessen xyz
als Shell-Funktion:
xyz () {
command1 </dev/null
command2 "$@"
}
Hier command2
erhalten Sie sowohl die Standardeingabe der Funktion als auch alle der Funktion übergebenen Befehlszeilenargumente.
Sie könnten dies nun wie in der Pipeline verwenden pqr | xyz -f -
.
Wenn (und nur wenn) die -f -
Argumente, die Sie an übergeben command2
, „von der Standardeingabe lesen“ lauten (wobei -
die Standardeingabe bezeichnet), dann können Sie stattdessen -
eine Prozesssubstitution an übergeben xyz
, sofern Ihre Shell dies unterstützt:
xyz -f <(pqr)
Mit der obigen Funktion wäre dies dasselbe wie
command1 </dev/null
command2 -f <(pqr)