Como suprimo a saída dd?

Tenho um script bash que cria alguns arquivos usando dd. O problema é que o dd gera uma grande quantidade de saída que vai atrapalhar a saída do meu script. Pesquisando, encontrei uma solução:

dd if=boot1h of="/dev/r$temp1" >& /dev/null 

Existe uma alternativa ou está redirecionando para /dev/null o única maneira?

Comentários

  • Eu ‘ perdi sua última frase, ” o script não deve solicitar privilégios “. Isso não ‘ não parece ter nada a ver com redirecionando para /dev/null – você ‘ está sudoing porque dd precisa de acesso de gravação para /dev/r$temp1 (presumo). Você ‘ vai precisar fazer isso, não importa como você suprime dd ‘ saída de s; redirecionar a saída para /dev/null não ‘ não requer raiz
  • Eu ‘ sou um idiota. Estava dando operação não permitida devido ao uso de / dev / r $ temp1 /. I

M realmente sinto muito. Eu ‘ estou editando um script que ‘ não é meu e não ‘ o notou . Sinto muito.

  • então o problema é que o usuário comum não pode escrever em / dev / r $ temp1 ou em dev / null
  • Não ‘ t se preocupe com isso; Eu editei um pouco para remover a parte confusa
  • Se você ‘ não estiver usando nenhum dos dd ‘ s recursos avançados, use cat, head ou tail.
  • Resposta

    Da dd(1) página de manual:

     status=noxfer suppress transfer statistics 

    assim:

    dd if=boot1h of="/dev/r$temp1" status=noxfer 

    Isso ainda resulta em

    0+1 records in 0+1 records out 

    lixo quando dd sai, então redirecionar para um coletor de dados é realmente sua única opção.

    Comentários

    • isso eu ‘ tenho medo de.
    • Eu acredito que status = noxfer, pode estar relacionado ao sinal SIGUSR1, que normalmente mostra a transferência estatística. No entanto, não estou disposto a testar se ‘ é verdade o que estou dizendo.

    Resposta

    Adicione status=none:

    dd if=boot1h of="/dev/r$temp1" status=none 

    do dd (coreutils) 8.21 docs :

     "status=LEVEL" Transfer information is normally output to stderr upon receipt of the "INFO" signal or when "dd" exits. Specifying LEVEL will adjust the amount of information printed, with the last LEVEL specified taking precedence. "none" Do not print any informational or warning messages to stderr. Error messages are output as normal. "noxfer" Do not print the final transfer rate and volume statistics that normally make up the last status line. "progress" Print the transfer rate and volume statistics on stderr, when processing each input block. Statistics are output on a single line at most once every second, but updates can be delayed when waiting on I/O.  

    Comentários

    • @roaima – apenas curiosidade, por que editar uma citação da página de manual?
    • @don_crissti Eu percebi que a (falta de) contexto ao extrair a citação da página de manual significava que era necessária uma forma ligeiramente diferente de palavras. Como está na página do manual , ‘ está bem; aqui parecia estranho.
    • @roaima – tudo bem – curiosidade satisfeita 🙂 – mas observe que você vincula a info page; a resposta inicial aqui tinha a citação exata de man page . Eu teria copiado / colado diretamente da página info se a página man fosse ambígua, mas, realmente, depende de você … Oh, btw, muito obrigado por seu outro comentário sobre minha resposta relacionado à classificação por dia da semana.
    • Não ‘ t parece estar disponível no dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO Esta deve ser a resposta aceita

    Resposta

    Para referência futura:

    Para suprimir a saída do dd, redirecione completamente o stderr para / dev / null da seguinte forma:

    dd if=/dev/urandom of=sample.txt bs=5MB count=1 2> /dev/null 

    Isso funciona muito bem se você quiser, por exemplo, cronometrar o processo usando o comando time em bash e atribuir o resultado a uma variável, sem obter qualquer saída que o dd produz.

    referência: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html

    Resposta

    Algo assim também deve funcionar para você com versões recentes do BASH e ZSH:

    dd if=/path/to/file of=/path/to/another_file bs=1M count=1 &> /dev/null 

    P.S. Este é apenas um exemplo que executei …

    Resposta

    Com qualquer aplicativo ou comando Unix, você pode suprimir todas as saídas com

    cmd >/dev/null 2>&1

    O primeiro bit redireciona a saída padrão (unidade número 1) para / dev / null. Mas você precisa da segunda parte para também redirecionar a saída de erro (unidade número 2) para o mesmo lugar que o número 1.

    No UNIX, STDIN = 0, STDOUT = 1 e STDERR = 2


    Comentários

    • Na verdade, stderr tem o descritor de arquivo 2 . (Presumo que ” STDERR = 3 ” seja apenas um erro de digitação.)
    • Não é desejável suprimir todas as saídas . Se ocorrer um erro, gostaríamos de ver a mensagem de erro.
    • cmd 2>logfile.txt parece mais adaptado

    Resposta

    Se bem entendi o que você está tentando fazer, você está colocando aquele sudo comando no script e esperando o script para solicitar sua senha quando for executado lá? Nesse caso, você está apenas fazendo as coisas da maneira complicada.

    Uma solução mais limpa é escrever o script da maneira usual (ou seja, sem sudo) e execute-o como superusuário . A razão por trás disso é, se o script precisa de acesso de superusuário, basta conceder o acesso (por que esperar até um determinado comando?). No script, para verificar se ele está sendo executado como root, faça algo assim:

    if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi 

    Comentários

    • não. Isso ‘ é exatamente o que eu não ‘ não quero fazer. Eu não ‘ não quero que o script seja executado como root apenas porque eu não ‘ não quero que o dd exiba a saída. Sua verificação seria corrigida se eu quiser que o script seja executado como superusuário.
    • @dierre Então, por que você precisava de sudo em primeiro lugar? Usuários normais devem ser capazes de redirecionar coisas para /dev/null muito bem.
    • Eu ‘ estou usando o Ubuntu e ele ‘ s me dando operação não permitida … uhm …
    • Eu ‘ sinto muito. Não ‘ não percebi que estava criando algo em / dev /. O roteiro não é meu, eu estava editando. Eu ‘ sinto muito.

    Resposta

    você pode redirecionar a saída para um arquivo normal, ou seja:

     dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log 

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *