Alternativa al comando tee sin STDOUT


37

Estoy usando | sudo tee FILENAMEpara poder escribir o agregar a un archivo para el cual se requieren permisos de superusuario con bastante frecuencia.

Aunque entiendo por qué es útil en alguna situación, eso teetambién envía su entrada a STDOUT nuevamente, nunca he usado esa parte teepara nada útil. En la mayoría de las situaciones, esta característica solo hace que mi pantalla se llene de fluctuaciones no deseadas, si no paso el paso adicional y la silencio manualmente tee 1> /dev/null.

Mi pregunta: ¿Hay un comando alrededor, que hace exactamente lo mismo que tee, pero por defecto no genera nada en STDOUT?


Si reemplaza el teecon cat >filename, ¿obtiene los resultados que desea?
aserrín

44
catno escribe en archivos por sí mismo. Y el >operador no funciona ya que mi usuario actual no puede escribir en los archivos. Entonces no, eso no ayuda un poco. Y deténgase para alterar completamente el significado de su comentario cada 2 segundos. Haz uno nuevo en su lugar.
aef

Si reemplaza el | sudo tee FILENAMEcon | sudo cat >filename, ¿obtiene los resultados que desea?
aserrín

44
No, el >operador utiliza el usuario de shell actual para escribir en el archivo. Este usuario no tiene los permisos necesarios. catEs completamente inútil para eso.
aef

Respuestas:


30

Otra opción que evita volver a conectar las cosas y luego a /dev/zeroes

sudo command | sudo dd of=FILENAME

1
Exactamente lo que estaba buscando. Muchas gracias.
aef

44
superuser.com/a/850294/68284 describe las oflag=append conv=notruncopciones adicionales que se pueden usar ddpara agregar.
aef

6

La ddsolución todavía imprime basura en stdout:

$ ls | sudo dd of=FILENAME
0+1 records in
0+1 records out
459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s

Eso se puede evitar usando la statusopción:

command | sudo dd status=none of=FILENAME

Otra posibilidad interesante (para Linux de todos modos):

command | sudo cp /dev/stdin FILENAME

Para copiar la entrada TTY en un archivo, a menudo hago esto:

sudo cp /dev/tty FILENAME

Es una lástima que la camiseta no tenga una opción para suprimir stdout.


4

Podrías usar un guión. Es decir, poner algo como esto en ie $HOME/bin/stee, 0teeo similar:

#!/bin/bash

argv=
while [[ "$1" =~ ^- ]]; do
    argv+=" $1"
    shift
done

sudo tee $argv "$1" > /dev/null

#!/bin/bash

sudo tee "$@" > /dev/null

Hazlo ejecutable:

$ chmod 755 stee

Ahora haz, es decir:

$ ls -la | stee -a / root / foo


1
Escribir un script y desplegarlo en todos los sistemas en los que trabajo no es exactamente lo que quería, pero hasta que alguien nombre una herramienta ya existente, creo que iré con su solución.
aef

2
En efecto. Me gustaría verlo yo mismo. Escribí un programa en C hace mucho tiempo que hizo lo que pides, pero hace mucho que se fue y se olvidó. No había casi ningún interés por eso cuando. Pero, de nuevo, en realidad no lo publicité mucho.
Luca Stein

2

Puede envolver todo su comando en sudo, por lo que el shell en sí, así como las redirecciones, se realizan como root:

sudo sh -c 'do_something > FILENAME'

-1

No hay un programa directamente para hacer eso (este es prácticamente el único momento en que sería útil), pero podría escribir fácilmente el suyo. Si no desea programar, también se podría escribir un script simple que hace lo mismo: cat > $1. Esto es diferente de ponerlo en línea (como sugiere el aserrín) porque el sudo se aplicará a todo el script, incluida la redirección.


-2

Sé que es un poco tarde, pero lo que hago en estos casos (cuando se necesita un stdout 'plano' pero también un archivo temporal) es:

tee whatever | grep -v ""

¿Puedes dar más detalles sobre lo que está haciendo este comando?
Vylix

Igual que tee> / dev / null, pero en su lugar a un grep que no coincide con nada.
00prometheus

Eso suena aún más hacky que redirigir la salida /dev/nully no hace que el comando sea más corto. ¿Cuál sería la ventaja de usar esto en lugar del método original?
Waldyrious
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.