Linux / Debian: ¿qué hace 'pipí' en moreutils?

Respuestas:

29

Esto es lo que puedes hacer con la orina:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Por lo tanto, orinar funciona con tuberías de shell en lugar de archivos.

bash no necesita orinar, puede abrir comandos de shell como archivos:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
Tobu
fuente
1
¿Funcionaría esto con jockers de nombre de archivo? Vea zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - pee se usa para multiplicar stdiny dar clones a cada script mathing el patrón de nombre de archivo, ¿puede bash puro hacer esto? AFAIU se expandiría con un asterisco dentro de los corchetes, causando algo como lo tee >(app1 app2 app3 app4)que no es lo >(app1) >(app2) >(app3) >(app4)que muestra su respuesta
Arioch 'The
@Arioch, la sintaxis de bash no funcionará con la técnica de hooks-joker. Simplemente instale moreutils.
Tobu
1
Use tee >/dev/nullpara evitar replicar stdin en stdout
jfs
1
La verdadera ventaja de orinar sobre el tee es que envía el stdout de cada subproceso al stdout del orinar en sí. con tee necesitas redirigir cada proceso stdout a un archivo si quieres guardarlo, pero con pee solo necesitas guardar el stdout. Por supuesto, eso solo tiene sentido si cada subcomando está emitiendo una cosa con un formato similar. como si no pudieras descubrir cómo hacerlo o expresiones regulares en grep que podrías hacer cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... usando tee solo obtendrías una copia de filestdout.
Underrun
La >(command)característica se llama sustitución de proceso .
Vlastimil Ovčáčík
16

Probablemente sea más fácil de entender si lo has usado teeprimero. Esta útil herramienta antigua toma entrada estándar y escribe en múltiples archivos, además de salida estándar. El seguimiento:

echo "Hello world" | tee one two

Creará dos archivos, el nombre oney two, a la vez que contiene la cadena Hello world. También se imprimirá en su terminal.


Ahora peerealiza una función similar, pero en lugar de redirigir la salida a múltiples archivos, redirige a múltiples comandos secundarios, ala canalizaciones. Difiere ligeramente de teeque no envía el stdin original a stdout porque no tendría sentido combinarlo con la salida de los comandos secundarios. El siguiente ejemplo muy simple:

echo "Hello world" | pee cat cat

Producirá la cadena Hello worlda su terminal dos veces. Esto se debe a que cada una de las dos instancias de catrecibe el resultado estándar y hace lo que cathace, que es imprimir.

Dan Carley
fuente