`tee` para comandos

15

teepuede redirigir la entrada estándar canalizada a la salida y al archivo estándar .

echo Hello, World! | tee greeting.txt

El comando anterior mostraría el saludo en la pantalla del terminal y lo guardaría en el contenido del greeting.txtarchivo, creando el archivo si no hay ninguno con ese nombre.

También hay un -ainterruptor para teeagregar al archivo existente en lugar de sobrescribir.


¿Hay alguna manera conveniente de redirigir la entrada canalizada al comando y la salida estándar en lugar del archivo?

Estoy tratando de crear una secuencia de comandos de contenedor para bukucopiar en la selección principal la URL del marcador especificado por su número de índice.

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

Aquí lo uso echo dos veces, primero para mostrar en el terminal y luego guardar en la selección principal (portapapeles).

Me imagino algo echo $url | teeC xselo un atajo para mostrar la salida antes de pasar al siguiente comando (encadenar comandos), lo que me permitiría encadenar todo el comando en una línea sin la necesidad de guardar el resultado en una variable de la siguiente manera:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

También puedo usarlo urlviewpara ver, seleccionar y abrir con lo $BROWSERsiguiente:

bukuc 10-20 | urlview

fuente
3
Prueba tee /dev/ttyo tty0(no recuerdo exactamente ... estoy en el camino)
George Vasiliou
2
info teemenciona la sustitución del proceso y la salida del tee de tubería a un programa ...
Xen2050 18/0617

Respuestas:

19

Es sencillo en los shells que admiten la sustitución del proceso , por ejemplo bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

De lo contrario, podría usar un FIFO (aunque carece de comodidad)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
conductor de acero
fuente
¡Gracias! Dos cosas que noté: 1. sh(Bourne shell) no admite esa característica; 2. La flecha debe pegarse como parte del operador único >()para la sustitución del proceso.
11

El análogo directo de "tee para comandos" es el peecomando de moreutils ( teepero con tuberías). Sus argumentos se usan como comandos para ejecutar, no como rutas, y obtienen la entrada canalizada a ellos en lugar de escribirlos en el archivo. Todos los comandos reciben la entrada estándar a la que se canalizó peecomo propia.

El uso pee, se puede obtener el resultado que quería diciéndole que se ejecute tanto xsely catcon la entrada.

echo foo | pee xsel cat

Hay un catproceso adicional flotando por allí para hacer la salida, lo cual no es realmente un problema para su caso de uso, pero podría ser menos ideal en otras ocasiones. Esto funciona con cualquier shell, a diferencia de la sustitución de procesos, pero por supuesto requiere una herramienta adicional (probablemente menos común) instalada.

Puede dar órdenes más complejas con una cita de ellos: pee "xsel --display :1" cat. Se ejecutan con ellos sh, por lo que debe tener cuidado con los metacaracteres de shell.

Michael Homer
fuente
44
Muy bien, no sabía sobre eso
Steeldriver
2
Ese no es un buen nombre.
David Richerby