2017-05-11 2 views
1

tl; dr: brauchen eine Möglichkeit, (mit grep) eine Ausgabe in subshell und AND umleiten alle ursprünglichen Ausgabe auf die wichtigsten stdout/stderr zur gleichen Zeit. Ich suche nach Shell-unabhängigen (!) Weg.Redirect Ausgabe von Subshell und Verarbeitung durch Rohr zur gleichen Zeit

Im Detail

  1. Es ist eine proprietäre binäre, die ich für einen Wert grep wollen

  2. Die proprietäre binäre von Zeit zu Zeit interaktiv sein könnte nach einem Passwort fragen (abhängig auf der internen Logik)

  3. Ich möchte die Ausgabe der binären ANZEIGEN grep und will in der Lage sein, das Passwort einzugeben, das benötigt wird, um fortzufahren

Also das Skript, das meine Aufgabe erreicht werden soll, könnte wie folgt aussehen:

#!/bin/sh 
user_id=... # some calculated value 

list_actions_cmd="./proprietary-binary --actions ${user_id}" 
action_item=$(${list_actions_cmd} | grep '^Main:') 

Hier proprietary-binary ein Passwort durch stdin fragen könnte. Da subshell innerhalb von $() die gesamte Ausgabe abfängt, wird ein Endbenutzer nicht verstehen, dass der list_actions_cmd auf Eingabe wartet. Was ich will, ist, entweder alle Ausgaben von list_action_cmd AND grepping gleichzeitig anzuzeigen oder zumindest das Schlüsselwort zu erfassen, dass der Benutzer nun nach einem Passwort gefragt wird und ihn darüber informiert.

Zeit, was ich herausgefunden ist tee die Ausgabe und grep gibt:

#!/bin/sh 
user_id=... # some calculated value 

list_actions_cmd="./proprietary-binary --actions ${user_id}" 
$list_actions_cmd 2>&1 | tee /tmp/.proprietary-binary.log 
action_item=$(grep "^Main" /tmp/.proprietary-binary.log) 

Aber ich frage mich ist es eine elegante Schale unabhängige (nicht bash beschränkt, die sehr mächtig ist) Lösung ohne Zwischen temporäre Datei? Vielen Dank.

+0

Sie lesen sollten [Bash FAQ 050] (http://mywiki.wooledge.org/BashFAQ/050). – chepner

+0

@chepner, wie Lesen würde mir mit dem Problem helfen? "Reading FAQ" könnte eine universelle Antwort für alle Fragen sein. Ich habe dort nachgesehen, aber kein Muster gefunden, um meine Frage zu lösen. – nebd

+0

Es beantwortet Ihre Frage nicht. Es erklärt, warum 'list_actions_cmd =" ​​... "' der falsche Ansatz ist. – chepner

Antwort

2

Was ist das Duplizieren ausgegeben, wenn in einem Terminal ausgeführt stderr:

item=$(your_command | tee /dev/stderr | grep 'regexp') 
+0

wow, das funktioniert! nette Annäherung! – nebd

Verwandte Themen