Alternativa ao comando tee sem STDOUT


37

Estou usando | sudo tee FILENAMEpara poder escrever ou anexar a um arquivo para o qual as permissões de superusuário são necessárias com bastante frequência.

Embora eu entenda por que é útil em alguma situação, que teetambém envia sua entrada para STDOUT novamente, nunca usei essa parte teepara algo útil. Na maioria das situações, esse recurso faz com que minha tela fique cheia de tremulação indesejada, se eu não der o passo extra e silenciá-lo manualmente tee 1> /dev/null.

Minha pergunta: Existe um comando ao redor, que faz exatamente a mesma coisa que tee, mas por padrão não gera nada para STDOUT?


Se você substituir o teepor cat >filename, obtém os resultados desejados?
sawdust

4
catnão grava nos arquivos por si só. E o >operador não funciona, pois os arquivos não são graváveis ​​pelo meu usuário atual. Então não, isso não ajuda nem um pouco. E pare para alterar completamente o significado do seu comentário a cada 2 segundos. Faça um novo.
aef

Se você substituir o | sudo tee FILENAMEpor | sudo cat >filename, obtém os resultados desejados?
Serragem

4
Não, o >operador usa o usuário atual do shell para gravar no arquivo. Este usuário não tem as permissões necessárias. caté completamente inútil para isso.
aef

Respostas:



6

A ddsolução ainda imprime lixo eletrônico no 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

Isso pode ser evitado usando a statusopção:

command | sudo dd status=none of=FILENAME

Outra possibilidade interessante (para o Linux de qualquer maneira):

command | sudo cp /dev/stdin FILENAME

Para copiar a entrada TTY em um arquivo, costumo fazer isso:

sudo cp /dev/tty FILENAME

É uma pena que o tee não tenha uma opção para suprimir o stdout.


4

Você poderia usar um script. Ou seja, coloque algo assim em ie $HOME/bin/stee, 0teeou similar:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Torne executável:

$ chmod 755 stee

Agora faça isto:

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


11
Escrever um script e implantá-lo em todos os sistemas em que trabalho não é exatamente o que eu queria, mas até que alguém nomeie uma ferramenta já existente, acho que seguirei sua solução.
aef

2
De fato. Gostaria de ver eu mesmo. Escrevi um programa em C há muito tempo, que fazia o que você pergunta, mas faz muito tempo que é esquecido. Não havia quase nenhum interesse em voltar quando. Mas, novamente, eu realmente não anunciei muito.
Luca Stein

2

Você pode agrupar todo o comando no sudo, para que o próprio shell, bem como os redirecionamentos, sejam executados como root:

sudo sh -c 'do_something > FILENAME'

-1

Não há diretamente um programa para fazer isso (esta é praticamente a única vez que seria útil), mas você pode escrever facilmente o seu. Se você não quer programa, você também pode escrever um script shell simples que faz a mesma coisa: cat > $1. Isso é diferente de colocá-lo em linha (como sugeriu serragem), porque o sudo se aplicará a todo o script, incluindo o redirecionamento.


-2

Eu sei que é um pouco tarde demais, mas o que faço nesses casos (quando é necessário um stdout 'flat', mas também um arquivo temporário) é:

tee whatever | grep -v ""

Você pode elaborar mais o que esse comando está fazendo?
precisa saber é o seguinte

O mesmo que tee> / dev / null, mas em vez disso é direcionado para um grep que não corresponde a nada.
00prometheus

Isso soa ainda mais hacky do que redirecionar a saída /dev/nulle não torna o comando mais curto. Qual seria a vantagem de usar isso em vez do método original?
waldyrious
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.