Como suprimo a saída dd?


35

Eu tenho um script bash que cria algum arquivo usando dd. O problema é que o dd lança uma grande quantidade de saída que vai mexer com 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/nulla única maneira?


3
Estou perdido na sua última frase, "o script não deve solicitar privilégios". Isso não parece ter nada a ver com o redirecionamento para /dev/null- você está processando porque ddprecisa de acesso de gravação /dev/r$temp1(presumo). Você precisará fazer isso, independentemente de como suprimir dda saída; redirecionar a saída para /dev/nullnão requer raiz
Michael Mrozek

Eu sou um idiota. Ele estava dando operação não permitida devido ao uso de / dev / r $ temp1 /. Eu realmente sinto muito. Estou editando um script que não é meu e não percebi. Sinceras desculpas.
dierre

então o problema é usuário regular não pode escrever para / dev / r $ temp1 ou para dev / null
jet

Não se preocupe com isso; Editei um pouco para remover a parte confusa
Michael Mrozek

11
Se você não estiver usando qualquer um dos dd suas características avançadas, uso cat, headou tailem vez disso.
Gilles 'SO- stop be evil'

Respostas:


16

Na dd(1)página do manual:

   status=noxfer
          suppress transfer statistics

portanto:

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

Isso ainda gera o

0+1 records in
0+1 records out

lixo quando ddsai, portanto, o redirecionamento para um coletor de dados é realmente sua única opção.


disso eu tenho medo.
dierre

Acredito status = noxfer, pode estar relacionado ao sinal SIGUSR1, que normalmente mostra a estatística de transferência. No entanto, não estou disposto a testar se é verdade o que estou dizendo.
Maxadamo # 30/16

54

Adicionar status=none:

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

Dos documentos do dd (coreutils) 8.21 :

'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.

@roaima - curioso, por que editar uma citação na página de manual?
don_crissti

@don_crissti Senti que o (falta de) contexto ao extrair a citação da página de manual significava que era necessária uma forma de palavras um pouco diferente. Como está na página de manual, tudo bem; aqui parecia estranho.
roaima

@roaima - tudo bem - curiosidade satisfeita :) - mas observe que você cria um link para o info page; a resposta inicial aqui tinha a citação exata do man page. Eu teria copiado / colado diretamente doinfo página se a manpágina for ambígua, mas realmente, até você ... Ah, btw, muito obrigado pelo seu outro comentário na minha resposta relacionada à classificação por dia da semana.
don_crissti

@don_crissti Não consegui encontrar uma página de manual on-line com a cotação; obrigado por esse. (die.net tem o mais velho ddsem status=)
roaima

3
Não parece estar disponível no dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Por Lundberg 23/15

5

Para referência futura:

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

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

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

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


2

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

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

PS Este é apenas um exemplo que eu corri ...


2

Com qualquer aplicativo ou comando Unix, você pode suprimir toda a saída com

cmd >/dev/null 2>&1

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

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



11
Na verdade, stderrpossui o descritor de arquivo 2 . (Suponho que "STDERR = 3" seja apenas um erro de digitação.) #
211 de 14/14

11
É indesejável suprimir toda a saída. Se ocorrer um erro, gostaríamos de ver a mensagem de erro.
Sam Watkins

cmd 2>logfile.txtparece mais adaptada
TheSola10

0

Se eu entendi direito o que você está tentando fazer, você está colocando isso sudo comando no script e esperando que o script solicite sua senha quando ela for executada lá? Nesse caso, você está apenas fazendo as coisas da maneira mais complicada.

Uma solução mais limpa é escrever o script da maneira usual (ou seja, sem sudo) e executá-lo como superusuário . A razão por trás disso é que, se o script precisar de acesso de superusuário, forneça apenas o acesso (por que esperar até um determinado comando?). No script, para verificar se 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

Não. É exatamente o que eu não quero fazer. Não quero que o script seja executado como root apenas porque não quero que o dd exiba a saída. Sua verificação seria correta se eu quiser que o script seja executado como superusuário.
dierre

@ Dierre Então, por que você precisava sudoem primeiro lugar? Usuários normais devem ser capazes de redirecionar as coisas para /dev/nulla perfeição.
phunehehe

Estou usando o Ubuntu e ele está me dando operação não permitida ... uhm ...
dierre

Eu sinto Muito. Eu não percebi que estava criando algo em / dev /. O script não é meu, eu estava editando. Eu realmente sinto muito.
dierre

0

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

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
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.