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?

aef
fonte
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
2
Veja também stackoverflow.com/questions/82256/…
Joachim Breitner

Respostas:

30

Outra opção que evita canalizar o material de volta e depois /dev/zeroé

sudo command | sudo dd of=FILENAME
Joachim Breitner
fonte
11
Exatamente o que eu estava procurando. Muito obrigado.
aef 7/09/13
4
superuser.com/a/850294/68284 descreve as oflag=append conv=notruncopções adicionais a serem usadas ddpara anexar.
aef 22/01
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.

Curt
fonte
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

Luca Stein
fonte
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'
Thunderbeef
fonte
-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.


fonte
-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 ""
Juan Camilo Gomez Martinez
fonte
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