Hvordan undertrykker jeg dd-utdata?

Jeg har et bash-skript som lager en fil ved hjelp av dd. Problemet er at dd kaster mye produksjon som kommer til å rote med utdataene fra skriptet mitt. Ved å søke rundt har jeg funnet en løsning:

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

Er det et alternativ, eller omdirigerer til /dev/null eneste måten?

Kommentarer

  • Jeg ‘ er tapt på din siste setning, » skriptet skal ikke be om rettigheter «. Det ser ikke ut til at ‘ har noe å gjøre med omdirigere til /dev/null – du ‘ sudoing fordi dd trenger skrivetilgang til /dev/r$temp1 (antar jeg). Du ‘ kommer til å trenge å gjøre det uansett hvordan du undertrykker dd ‘ s output; omdirigering av output til /dev/null krever ikke ‘ t root
  • Jeg ‘ er en idiot. Det var å gi operasjon ikke tillatt på grunn av bruken av / dev / r $ temp1 /. I

jeg er veldig lei meg. Jeg ‘ redigerer et skript som ‘ ikke er mitt og la ikke merke til det ‘ . Beklager.

  • så problemet er at vanlig bruker ikke kan skrive til / dev / r $ temp1 eller til dev / null
  • Don ‘ ikke bekymre deg for det; Jeg redigerte det litt for å fjerne den forvirrende delen
  • Hvis du ‘ ikke bruker noen av dd ‘ s avanserte funksjoner, bruk cat, head eller tail i stedet.
  • Svar

    Fra dd(1) man-siden:

     status=noxfer suppress transfer statistics 

    thus:

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

    Dette gir fremdeles ut

    0+1 records in 0+1 records out 

    søppel når dd går ut, så omdirigering til et datasink er virkelig det eneste alternativet.

    Kommentarer

    • det var jeg ‘ er redd for.
    • Jeg tror status = noxfer, kan være relatert til SIGUSR1 signal, som normalt viser overføringen statistikk. Jeg er ikke villig til å teste om det ‘ stemmer hva jeg sier.

    Svar

    Legg til status=none:

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

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

    Kommentarer

    • @roaima – bare nysgjerrig, hvorfor redigere et sitat fra mannssiden?
    • @don_crissti Jeg følte (mangel på) kontekst i å trekke ut sitatet fra mannssiden, betyr at det krevde en litt annen form for ord. Slik det står på man-siden er det ‘ greit; her så det rart ut.
    • @roaima – ok – nysgjerrighet fornøyd 🙂 – men merk at du lenker til info page; det opprinnelige svaret her hadde det eksakte sitatet fra man page . Jeg ville ha kopiert / limt inn direkte fra info -siden hvis man -siden er tvetydig, men egentlig opp til deg … Å, btw, tusen takk for den andre kommentaren din på svaret mitt knyttet til sortering etter ukedag.
    • Ser det ikke ut ‘ å være tilgjengelig i dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO Dette skal være det aksepterte svaret

    Svar

    For fremtidig referanse:

    For å undertrykke dd-utdata omdirigere stderr til / dev / null slik:

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

    Dette fungerer fint hvis du for eksempel ønsker å prosessere tid ved å bruke tidskommandoen i bash og tildele resultatet til en variabel, uten å få noe av utdataene som dd produserer.

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

    Svar

    Noe som dette skal også fungere for deg med nyere versjoner av BASH og ZSH:

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

    P.S. Dette er bare et eksempel jeg kjørte …

    Svar

    Med et hvilket som helst Unix-program eller en kommando kan du undertrykke all utdata med

    cmd >/dev/null 2>&1

    Den første biten omdirigerer standardutgangen (enhetsnummer 1) til / dev / null. Men du trenger den andre delen for også å omdirigere feilutgangen (enhet nummer 2) til samme sted som nummer 1.

    I UNIX, STDIN = 0, STDOUT = 1 og STDERR = 2


    Kommentarer

    • Egentlig stderr har filbeskrivelsen 2 . (Jeg antar at » STDERR = 3 » er bare en skrivefeil.)
    • Det er uønsket å undertrykke all produksjon . Hvis det oppstår en feil, vil vi se feilmeldingen.
    • cmd 2>logfile.txt virker mer tilpasset

    Svar

    Hvis jeg forstår riktig hva du prøver å gjøre, legger du den sudo kommandoen inn i skriptet og forventer skriptet for å be om passordet ditt når det kjører der? I så fall gjør du bare ting på den kompliserte måten.

    En renere løsning er å skrive skriptet på vanlig måte (dvs. uten sudo) og kjør den som superbruker . Årsaken bak dette er at hvis skriptet trenger tilgang til superbruker, så bare gi det tilgangen (hvorfor vente til en bestemt kommando?). For å sjekke om det kjøres som root, gjør du noe som dette i skriptet:

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

    Kommentarer

    • nei. At ‘ er akkurat det jeg ikke ‘ ikke vil gjøre. Jeg vil ikke ‘ t vil at skriptet skal kjøres som rot bare fordi jeg ikke ‘ t vil at dd skal vise utdataene. Sjekken din vil korrigere hvis jeg vil at skriptet skal kjøres som superbruker.
    • @dierre Så hvorfor trengte du i første omgang sudo? Normale brukere skal kunne omdirigere ting til /dev/null helt fint.
    • Jeg ‘ m bruker Ubuntu og det ‘ s gir meg operasjon ikke tillatt … uhm …
    • Jeg ‘ beklager. Jeg la ikke ‘ ikke merke til at jeg opprettet noe under / dev /. Manuset er ikke mitt, jeg redigerte det. Jeg ‘ beklager virkelig.

    Svar

    du kan omdirigere utdata til en vanlig fil, dvs.:

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

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *