2012-09-22 10 views
5

Gibt es ein idiomatisches Analog zu Rubys für Unix-Befehlspipelines?Idiomatisches Analog zu Rubys "Objekt # tap" für den Unix-Befehl Pipelines?

Anwendungsfall: Innerhalb einer Pipeline möchte ich einen Befehl für seine Nebeneffekte ausführen, aber die Eingabe implizit zurückgeben, um die Verkettung der Pipeline nicht zu unterbrechen. Zum Beispiel:

echo { 1, 2, 3 } | 
    tr ' ' '\n' | 
    sort | 
    tap 'xargs echo' | # arbitrary code, but implicitly return the input 
    uniq 

Ich komme von Ruby, wo ich dies tun würde:

[ 1, 2, 3 ]. 
    sort. 
    tap { |x| puts x }. 
    uniq 

Antwort

6

Der tee Befehl ist ähnlich; Es schreibt seine Eingabe in die Standardausgabe sowie in eine oder mehrere Dateien. Wenn diese Datei eine Prozesssubstitution ist, haben Sie den gleichen Effekt, glaube ich.

echo 1 2 3 | tr ' ' '\n' | sort | tee >(**code**) | uniq 

Der Code im Prozess Substitution von der Standardeingabe lesen würde, die die gleiche Sache, dass der Anruf zu sehen, zu uniq endet sein sollen.

+0

+1 für 'Prozesssubstitution'. Es besteht die Notwendigkeit für die meisten der/tmp-Dateien, die ich je benutzt habe. –

+0

Und falls Sie nur nach 'stderr',' ... | anzeigen möchten tee/dev/stderr | ... '. – Vic