Alternativa al comando tee senza STDOUT


37

Sto usando | sudo tee FILENAMEper essere in grado di scrivere o aggiungere a un file per il quale sono richieste abbastanza spesso autorizzazioni di superutente.

Anche se capisco perché è utile in alcune situazioni, che teeinvia di nuovo il suo input a STDOUT, non ho mai usato quella parte di teequalcosa di utile. Nella maggior parte dei casi, questa funzione fa sì che il mio schermo si riempia di jitter indesiderato, se non faccio il passo aggiuntivo e lo silenzio manualmente tee 1> /dev/null.

La mia domanda: c'è un comando intorno, che fa esattamente la stessa cosa di tee, ma per impostazione predefinita non produce nulla su STDOUT?


Se si sostituisce teecon cat >filename, si ottengono i risultati desiderati?
segatura

4
catnon scrive sui file da solo. E l' >operatore non funziona poiché i file non sono scrivibili dal mio attuale utente. Quindi no, questo non aiuta un po '. E ti preghiamo di smettere di modificare completamente il significato del tuo commento ogni 2 secondi. Creane uno nuovo invece.
aef

Se si sostituisce | sudo tee FILENAMEcon | sudo cat >filename, si ottengono i risultati desiderati?
segatura

4
No, l' >operatore utilizza l'utente shell corrente per scrivere nel file. Questo utente non ha i permessi necessari. catè completamente inutile per questo.
aef

Risposte:


30

Un'altra opzione che evita di reindirizzare le cose e poi /dev/zeroè

sudo command | sudo dd of=FILENAME

1
Esattamente quello che stavo cercando. Grazie mille.
aef

4
superuser.com/a/850294/68284 descrive le oflag=append conv=notruncopzioni aggiuntive da utilizzare ddper aggiungere.
aef

6

La ddsoluzione stampa ancora junk su 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

Questo può essere evitato usando l' statusopzione:

command | sudo dd status=none of=FILENAME

Un'altra possibilità interessante (per Linux comunque):

command | sudo cp /dev/stdin FILENAME

Per copiare l'input TTY in un file, spesso faccio questo:

sudo cp /dev/tty FILENAME

Peccato che non ci sia un'opzione per sopprimere stdout.


4

Potresti usare uno script. Vale a dire qualcosa del genere in ie $HOME/bin/stee, 0teeo simile:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Renderlo eseguibile:

$ chmod 755 stee

Ora fai cioè:

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


1
Scrivere una sceneggiatura e distribuirla su tutti i sistemi su cui lavoro non è esattamente quello che volevo, ma fino a quando qualcuno non nominerà uno strumento già esistente, penso che andrò con la tua soluzione.
aef

2
Infatti. Mi piacerebbe vederlo da solo. Ho scritto un programma in C molto tempo fa che faceva quello che chiedi, ma è passato molto tempo e dimenticato. Non c'era quasi interesse per questo quando. Ma poi non l'ho pubblicizzato molto.
Luca Stein,

2

Puoi racchiudere l'intero comando in sudo, quindi la shell stessa, così come i reindirizzamenti, vengono eseguiti come root:

sudo sh -c 'do_something > FILENAME'

-1

Non esiste direttamente un programma per farlo (questa è praticamente l'unica volta in cui sarebbe utile), ma potresti facilmente scrivere il tuo. Se non si desidera il programma, si potrebbe anche scrivere un semplice script di shell che fa la stessa cosa: cat > $1. Questo è diverso dal metterlo in linea (come suggerito dalla segatura) perché il sudo si applicherà all'intero script, incluso il reindirizzamento.


-2

So che è un po 'troppo tardi, ma quello che faccio in questi casi (quando è necessario uno stdout "piatto" ma anche un file temporaneo) è:

tee whatever | grep -v ""

Puoi approfondire cosa sta facendo questo comando?
Vylix,

Come per tee> / dev / null, ma effettua il piping su un grep che non corrisponde a nulla.
00prometheus

Sembra ancora più confuso che reindirizzare l'output a /dev/null, e non rende il comando più breve. Quale sarebbe il vantaggio di utilizzare questo invece del metodo originale?
waldyrious
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.