Wie übergebe ich die weitergeleitete Eingabe in einem Alias ​​an den zweiten Befehl?

Wie übergebe ich die weitergeleitete Eingabe in einem Alias ​​an den zweiten Befehl?

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 aliasDefinition beibehalten und

alias xyz='{ command1; command2; }'

In diesem Fall comamnd1erhä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 bashProzesssubstitution zshunterstützt, können Sie einfach festlegen, command2dass 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 pqrmit command2als Eingabeargument.

Antwort3

So übergeben Sie etwas an die Standardeingabe command2in der Befehlsliste

command1; command2

Sie müssen sicherstellen, dass command1nicht von der Standardeingabe gelesen wird. Dies könnte durch Umleiten der Standardeingabe von /dev/nullnach 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 xyzals Shell-Funktion:

xyz () {
    command1 </dev/null
    command2 "$@"
}

Hier command2erhalten 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)

verwandte Informationen