Come faccio a sopprimere loutput dd?

Ho uno script bash che crea alcuni file utilizzando dd. Il problema è che dd genera una grande quantità di output che comprometterà loutput del mio script. Cercando in giro ho trovato una soluzione:

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

Esiste unalternativa o sto reindirizzando a /dev/null unico modo?

Commenti

  • ‘ mi sono perso sulla tua ultima frase, ” lo script non dovrebbe richiedere i privilegi “. Questo ‘ non sembra avere nulla a che fare con reindirizzamento a /dev/null – ‘ reindirizzamento perché dd necessita dellaccesso in scrittura a /dev/r$temp1 (presumo). ‘ dovrai farlo indipendentemente da come sopprimi dd ‘ s output; il reindirizzamento delloutput a /dev/null ‘ non richiede root
  • Io ‘ sono un idiota. Non era consentita unoperazione a causa delluso di / dev / r $ temp1 /. I

mi dispiace davvero. Ho ‘ modificando uno script che ‘ non è mio e ‘ non lho notato . Mi dispiace davvero.

  • quindi il problema è che lutente normale non può scrivere in / dev / r $ temp1 o in dev / null
  • Don ‘ non ti preoccupare; Lho modificato un po per rimuovere la parte confusa
  • Se ‘ non stai utilizzando nessuno dei dd ‘ funzioni avanzate, utilizza cat, head o tail.
  • Risposta

    Dalla pagina man dd(1):

     status=noxfer suppress transfer statistics 

    quindi:

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

    Questo restituisce ancora

    0+1 records in 0+1 records out 

    spazzatura quando dd esce, quindi il reindirizzamento a un data sink è davvero lunica opzione.

    Commenti

    • che ero ‘ temevo.
    • Credo che status = noxfer, potrebbe essere correlato al segnale SIGUSR1, che normalmente mostra il trasferimento statistica. Tuttavia, non sono disposto a verificare se ‘ è vero quello che sto dicendo.

    Risposta

    Aggiungi status=none:

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

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

    Commenti

    • @roaima – solo curioso, perché modificare una citazione dalla pagina man?
    • @don_crissti Ho sentito che la (mancanza di) contesto nellestrarre la citazione dalla pagina man significava che richiedeva una forma di parole leggermente diversa. Così comè nella pagina man , ‘ va bene; qui sembrava strano.
    • @roaima – va bene – curiosità soddisfatta 🙂 – ma nota che ti colleghi al info page; la risposta iniziale qui aveva la citazione esatta da man page . Avrei copiato / incollato direttamente dalla pagina info se la pagina man fosse ambigua ma davvero, dipende da te … Oh, btw, grazie mille per il tuo altro commento sulla mia risposta relativa allordinamento per giorno della settimana.
    • Non ‘ sembra essere disponibile in dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO Questa dovrebbe essere la risposta accettata

    Risposta

    Per riferimento futuro:

    Per sopprimere loutput dd reindirizzare completamente stderr a / dev / null in questo modo:

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

    Funziona bene se si desidera, ad esempio, cronometrare il processo utilizzando il comando time in bash e assegnare il risultato a una variabile, senza ottenere loutput prodotto da dd.

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

    Risposta

    Qualcosa di simile dovrebbe funzionare anche per te con le versioni recenti di BASH e ZSH:

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

    P.S. Questo è solo un esempio che ho eseguito …

    Risposta

    Con qualsiasi applicazione o comando Unix, puoi sopprimere tutto loutput con

    cmd >/dev/null 2>&1

    Il primo bit reindirizza lo standard output (unità numero 1) a / dev / null. Ma è necessaria la seconda parte ANCHE per reindirizzare loutput dellerrore (unità numero 2) nello stesso punto del numero 1.

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


    Commenti

    • In realtà, stderr ha il descrittore di file 2 . (Presumo che ” STDERR = 3 ” sia solo un errore di battitura.)
    • Non è consigliabile sopprimere tutto loutput . Se si verifica un errore, vorremmo vedere il messaggio di errore.
    • cmd 2>logfile.txt sembra più adattato

    Rispondi

    Se capisco correttamente cosa stai cercando di fare, stai inserendo il comando sudo nello script e ti aspetti lo script per richiedere la password quando viene eseguito lì? In tal caso stai facendo le cose in modo complicato.

    Una soluzione più pulita è scrivere lo script nel modo usuale (cioè senza sudo) e eseguilo come superutente . Il motivo è che, se lo script necessita dellaccesso come superutente, concedigli laccesso (perché aspettare fino a un certo comando?). Nello script, per verificare se viene eseguito come root, eseguire una procedura simile:

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

    Commenti

    • no. Questo ‘ è esattamente quello che ‘ non voglio fare. Non ‘ voglio che lo script venga eseguito come root solo perché ‘ non voglio che dd visualizzi loutput. Il tuo controllo verrebbe corretto se voglio che lo script venga eseguito come superutente.
    • @dierre Allora perché hai bisogno di sudo in primo luogo? Gli utenti normali dovrebbero essere in grado di reindirizzare le cose a /dev/null benissimo.
    • I ‘ m usando Ubuntu e ‘ mi sta dando operazione non consentita … uhm …
    • Mi ‘ mi dispiace. ‘ non ho notato che stavo creando qualcosa in / dev /. Lo script non è mio, lo stavo modificando. ‘ mi dispiace davvero.

    Rispondi

    puoi reindirizza loutput a un file normale, ad esempio:

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

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *