2012-09-22 12 views
5

¿Hay un análogo idiomático al Object#tap de Ruby para las tuberías de comando de Unix?Idiomatic Analog to Ruby's `Object # tap` para comando Unix ¿Tuberías?

Caso de uso: dentro de una tubería Quiero ejecutar un comando para sus efectos secundarios, pero devuelvo la entrada implícitamente para no romper el encadenamiento de la tubería. Por ejemplo:

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

estoy procedentes de Rubí, donde me gustaría hacer esto:

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

Respuesta

6

El comando tee es similar; escribe su entrada a la salida estándar, así como a uno o más archivos. Si ese archivo es una sustitución de proceso, creo que obtienes el mismo efecto.

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

El código en el proceso de sustitución se lee de la entrada estándar, que debe ser el mismo que el llamado a uniq acaba de ver.

+0

+1 para 'proceso de sustitución'. Ahí va la necesidad de la mayoría de los archivos/tmp que he usado alguna vez. –

+0

Y en caso de que solo quiera mostrar 'stderr',' ... | tee/dev/stderr | ... '. – Vic