Alternative à la commande tee sans STDOUT


37

J'utilise | sudo tee FILENAMEpour pouvoir écrire ou ajouter à un fichier pour lequel les autorisations de superutilisateur sont requises assez souvent.

Bien que je comprenne pourquoi il est utile dans certaines situations, qui teeenvoie également à nouveau son entrée à STDOUT, je n'ai jamais réellement utilisé cette partie de teepour quelque chose d'utile. Dans la plupart des situations, cette fonctionnalité ne fait que remplir mon écran de gigue indésirable, si je ne passe pas à l'étape supplémentaire et que je la coupe manuellement avec tee 1> /dev/null.

Ma question: y a-t-il une commande autour, qui fait exactement la même chose que tee, mais par défaut ne produit rien vers STDOUT?


Si vous remplacez le teepar cat >filename, obtenez-vous les résultats souhaités?
sciure

4
catn'écrit pas dans les fichiers par lui-même. Et l' >opérateur ne fonctionne pas car les fichiers ne sont pas accessibles en écriture par mon utilisateur actuel. Alors non, ça n'aide pas du tout. Et veuillez vous arrêter pour modifier complètement la signification de votre commentaire toutes les 2 secondes. Faites-en un nouveau à la place.
aef

Si vous remplacez le | sudo tee FILENAMEpar | sudo cat >filename, obtenez-vous les résultats souhaités?
sciure

4
Non, l' >opérateur utilise l'utilisateur shell actuel pour écrire dans le fichier. Cet utilisateur n'a pas les autorisations nécessaires. catest complètement inutile pour ça.
aef

Réponses:


30

Une autre option qui évite redirigeant la substance en arrière et puis /dev/zeroest -

sudo command | sudo dd of=FILENAME

1
Exactement ce que je cherchais. Grand merci.
aef

4
superuser.com/a/850294/68284 décrit les oflag=append conv=notruncoptions supplémentaires à utiliser ddpour l'ajout.
aef

6

La ddsolution imprime toujours indésirable sur 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

Cela peut être évité en utilisant l' statusoption:

command | sudo dd status=none of=FILENAME

Une autre possibilité intéressante (pour Linux quand même):

command | sudo cp /dev/stdin FILENAME

Pour copier l'entrée TTY dans un fichier, je fais souvent ceci:

sudo cp /dev/tty FILENAME

C'est dommage que le tee n'ait pas d'option pour supprimer la sortie standard.


4

Vous pouvez utiliser un script. C'est à dire mettre quelque chose comme ça dans ie $HOME/bin/stee, 0teeou similaire:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Rendez-le exécutable:

$ chmod 755 stee

Maintenant, c'est-à-dire:

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


1
Écrire un script et le déployer sur tous les systèmes sur lesquels je travaille n'est pas exactement ce que je voulais, mais jusqu'à ce que quelqu'un nomme un outil déjà existant, je pense que j'irai avec votre solution.
aef

2
Effectivement. Aimerais le voir moi-même. J'ai écrit un programme en C il y a longtemps qui a fait ce que vous demandez, mais il est depuis longtemps oublié et oublié. Il n'y avait presque aucun intérêt pour cela à l'époque. Mais là encore, je ne l'ai pas beaucoup annoncé.
Luca Stein

2

Vous pouvez envelopper toute votre commande dans sudo, de sorte que le shell lui-même, ainsi que les redirections, sont effectués comme suit root:

sudo sh -c 'do_something > FILENAME'

-1

Il n'y a pas directement de programme pour le faire (c'est à peu près la seule fois où cela serait utile), mais vous pouvez facilement écrire le vôtre. Si vous ne voulez pas le programme, vous pouvez aussi écrire un script shell simple qui fait la même chose: cat > $1. C'est différent de le mettre en ligne (comme le suggère la sciure de bois) car le sudo s'appliquera à l'ensemble du script, y compris la redirection.


-2

Je sais qu'il est un peu trop tard, mais ce que je fais dans de tels cas (lorsqu'une sortie standard "mais aussi un fichier temporaire est nécessaire) est:

tee whatever | grep -v ""

Pouvez-vous développer davantage ce que fait cette commande?
Vylix

Identique à tee> / dev / null, mais à la place vers un grep qui ne correspond à rien.
00prometheus

Cela semble encore plus hacky que de rediriger la sortie vers /dev/null, et ne raccourcit pas la commande. Quel serait l'avantage d'utiliser cela au lieu de la méthode d'origine?
waldyrious
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.