Come sopprimere l'output dd?


35

Ho uno script bash che crea alcuni file usando dd. Il problema è che getta una grande quantità di output che rovinerà l'output del mio script. Cercando in giro ho trovato una soluzione:

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

Esiste un'alternativa o il reindirizzamento /dev/nullall'unico modo?


3
Mi sono perso sull'ultima frase, "lo script non dovrebbe richiedere privilegi". Ciò non sembra avere nulla a che fare con il reindirizzamento a /dev/null- stai facendo un salto perché ha ddbisogno dell'accesso in scrittura /dev/r$temp1(suppongo). Dovrai farlo, indipendentemente da come elimini ddl'output; il reindirizzamento dell'output /dev/nullnon richiede il root
Michael Mrozek

Sono un idiota. Stava dando un'operazione non consentita a causa dell'uso di / dev / r $ temp1 /. Sono davvero dispiaciuto. Sto modificando una sceneggiatura che non è mia e non me ne sono accorta. Veramente dispiaciuto.
dierre,

quindi il problema è che l'utente normale non può scrivere su / dev / r $ temp1 o su dev / null
jet

Non ti preoccupare; L'ho modificato un po 'per rimuovere la parte confusa
Michael Mrozek

1
Se non stai utilizzando una delle DD caratteristiche avanzate, l'uso cat, heado tailinvece.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


16

Dalla dd(1)pagina man:

   status=noxfer
          suppress transfer statistics

in tal modo:

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

Questo genera ancora il

0+1 records in
0+1 records out

spazzatura ddall'uscita, quindi il reindirizzamento a un sink di dati è davvero l'unica opzione.


quello di cui avevo paura.
dierre,

Credo che status = noxfer, potrebbe essere correlato al segnale SIGUSR1, che normalmente mostra la statistica di trasferimento. Tuttavia, non sono disposto a testare se è vero quello che sto dicendo.
maxadamo,

54

Aggiungi status=none:

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

Dai documenti 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 - solo curioso, perché modificare una citazione dalla pagina man?
don_crissti,

@don_crissti Ho sentito che la (mancanza di) contesto nell'estrarre la citazione dalla pagina man significava che richiedeva una forma leggermente diversa di parole. Così com'è nella pagina man va bene; qui sembrava strano.
roaima,

@roaima - d'accordo - curiosità soddisfatta :) - ma nota che ti colleghi a info page; la risposta iniziale qui aveva la citazione esatta dal man page. Avrei copiato / incollato direttamente dalla infopagina se la manpagina fosse ambigua ma davvero, dipende da te ... Oh, a proposito, grazie mille per il tuo altro commento sulla mia risposta relativa all'ordinamento per giorno della settimana.
don_crissti,

@don_crissti Non sono riuscito a trovare una pagina man online con la citazione; grazie per quello. (die.net ha il vecchio ddsenza status=)
roaima,

3
Non sembra essere disponibile in dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg,


2

Qualcosa del genere dovrebbe funzionare anche con le versioni recenti di BASH e ZSH:

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

PS Questo è solo un esempio che ho eseguito ...


2

Con qualsiasi applicazione o comando Unix, puoi sopprimere tutti gli output con

cmd >/dev/null 2>&1

Il primo bit reindirizza l'output standard (unità numero 1) su / dev / null. Ma è necessario che la seconda parte reindirizzi ANCHE l'output dell'errore (unità numero 2) nella stessa posizione del numero 1.

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



1
In realtà, stderrha il descrittore di file 2 . (Suppongo che "STDERR = 3" sia solo un refuso.)
n.

1
Non è consigliabile sopprimere tutti gli output. Se si verifica un errore, vorremmo vedere il messaggio di errore.
Sam Watkins,

cmd 2>logfile.txtsembra più adattato
TheSola10

0

Se capisco correttamente cosa stai cercando di fare, stai inserendo quel sudocomando nello script e ti aspetti che lo script richieda la tua password quando viene eseguito lì? In tal caso, stai solo facendo le cose in modo complicato.

Una soluzione più pulita è scrivere lo script nel solito modo (cioè senza sudo) ed eseguirlo come superutente . Il motivo dietro questo è, se lo script ha bisogno di un accesso da superutente, quindi dagli solo l'accesso (perché aspettare fino a un certo comando?). Nello script, per verificare se viene eseguito come root, fare qualcosa del genere:

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

no. Questo è esattamente quello che non voglio fare. Non voglio che lo script venga eseguito come root solo perché non voglio che dd visualizzi l'output. Il tuo controllo verrebbe corretto se volessi che lo script venisse eseguito come superutente.
dierre,

@dierre Allora perché ne hai bisogno sudoin primo luogo? Gli utenti normali dovrebbero essere in grado di reindirizzare le cose alla /dev/nullperfezione.
phunehehe,

Sto usando Ubuntu e mi sta dando un'operazione non consentita ... uhm ...
Dierre,

Mi dispiace. Non ho notato che stavo creando qualcosa sotto / dev /. La sceneggiatura non è mia, la stavo modificando. Sono davvero dispiaciuto.
dierre,

0

puoi reindirizzare l'output su un file normale, ad esempio:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.