58 votes

Alternative à la commande tee sans STDOUT

J'utilise | sudo tee FILENAME pour pouvoir écrire ou ajouter des données à un fichier pour lequel les autorisations du super-utilisateur sont souvent requises.

Bien que je comprenne pourquoi cela peut être utile dans certaines situations, ce n'est pas le cas. tee envoie également son entrée à STDOUT, mais je n'ai jamais vraiment utilisé cette partie de tee pour trouver quelque chose d'utile. Dans la plupart des situations, cette fonction ne fait que remplir mon écran d'une gigue indésirable, si je ne fais pas l'effort supplémentaire de la faire taire manuellement à l'aide de la fonction tee 1> /dev/null .

Ma question : Existe-t-il une commande qui fait exactement la même chose que tee mais n'émet rien par défaut vers STDOUT ?

0voto

christianlc Points 121

Tentative de création d'un fichier dans un répertoire appartenant à la racine

$ ls -la /opt/ | head -2
total 0
drwxr-xr-x   3 root  wheel   96 Jun 13  2019 .
$ touch /opt/bufu
touch: /opt/bufu: Permission denied

créer un fichier en utilisant la redirection, enregistrer l'événement et écrire le contenu du fichier sur stdout, en quelque sorte en parallèle, certainement en simultané.

$ cat /tmp/test.sh
#!/bin/sh

file=/opt/bufu
message="an embarrassing failure"
rm -rf $file

{ echo $file \
    | tee /dev/fd/2 \
    | xargs sudo sh -c 'echo $1 >$2' _ "$message"
} 2>&1 \
    |
{ tee /dev/fd/3 \
    | xargs logger -s "Create File"

} 3>&1 \
    |
{ xargs cat \
    | xargs -I% echo file content is "%"
}

$ /tmp/test.sh
rm: /opt/bufu: Permission denied
Feb  7 17:03:16  bufu[4039] <Notice>: Create File /opt/bufu
file content is an embarrassing failure

mec, ce n'est pas la faute de tee s'il est forcé dans une position inconfortable - utilise xargs sh, ou écris ton propre one-liner

cat <<eof >./aef
echo "$1" >$2
eof
..
sudo aef "is a cool guy" /opt/fubar

0voto

imarsman Points 1

J'ai écrit un équivalent de tee en Go auquel j'ai ajouté le drapeau no stdout. Il peut être intéressant (bien que ce soit une vieille question). Il a été écrit pour s'amuser, je ne prétends donc pas qu'il puisse être utilisé en production.

https://github.com/imarsman/gotee

-1voto

Il n'existe pas directement de programme pour faire cela (c'est à peu près le seul cas où cela serait utile), mais vous pouvez facilement écrire le vôtre. Si vous ne voulez pas programmer, vous pouvez aussi écrire un simple Shell Shell qui fait la même chose : cat > $1 . C'est différent de la mise en ligne (comme l'a suggéré sawdust) parce que le sudo s'appliquera à l'ensemble du script, y compris la redirection.

-1voto

Je sais que c'est un peu trop tard, mais ce que je fais dans de tels cas (quand un stdout 'plat' mais aussi un fichier temporaire sont nécessaires) est :

tee whatever | grep -v ""

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X