Hur undertrycker jag dd-utdata?

Jag har ett bash-skript som skapar en fil med dd. Problemet är att dd kastar en stor mängd utdata som kommer att röra med utdata från mitt skript. Sökning runt Jag har hittat en lösning:

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

Finns det ett alternativ, eller omdirigeras till /dev/null enda sättet?

Kommentarer

  • Jag ’ jag tappade på din sista mening, ” manuset bör inte begära behörigheter ”. Det verkar inte ’ t har något att göra med omdirigerar till /dev/null – du ’ sudoing eftersom dd behöver skrivåtkomst till /dev/r$temp1 (antar jag). Du ’ kommer att behöva göra det oavsett hur du undertrycker dd ’ s output; omdirigera output till /dev/null kräver inte ’ t root
  • Jag ’ är en idiot. Det var att ge operation inte tillåten på grund av användningen av / dev / r $ temp1 /. I

jag är verkligen ledsen. Jag ’ redigerar ett skript som ’ inte är mitt och märkte inte ’ . Verkligen ledsen.

  • så problemet är att vanlig användare inte kan skriva till / dev / r $ temp1 eller till dev / null
  • Don ’ oroa dig inte för det; Jag redigerade det lite för att ta bort den förvirrande delen
  • Om du ’ inte använder någon av dd ’ s avancerade funktioner, använd cat, head eller tail istället.
  • Svar

    Från dd(1) man-sidan:

     status=noxfer suppress transfer statistics 

    således:

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

    Detta matar fortfarande ut

    0+1 records in 0+1 records out 

    sopor när dd går ut, så omdirigering till en datasink är verkligen ditt enda alternativ.

    Kommentarer

    • det var jag ’ är rädd för.
    • Jag tror status = noxfer, kan relateras till SIGUSR1-signal, som normalt visar överföringen statistisk. Jag är dock inte villig att testa om det ’ stämmer vad jag säger.

    Svar

    Lägg till status=none:

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

    Från 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 – bara nyfiken, varför redigera ett citat från mansidan?
    • @don_crissti Jag kände att (bristen på) sammanhang för att extrahera citatet från mansidan innebar att det krävde en lite annan form av ord. Som det står på mansidan är det ’ bra; här såg det konstigt ut.
    • @roaima – okej – nyfikenhet nöjd 🙂 – men notera att du länkar till info page; det ursprungliga svaret här hade det exakta citatet från man page . Jag skulle ha kopierat / klistrat in direkt från info -sidan om man -sidan är tvetydig men verkligen upp till dig … Åh, btw, tack så mycket för din andra kommentar till mitt svar relaterat till sortering efter veckodag.
    • Verkar inte ’ t vara tillgängligt i dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO Detta bör vara det accepterade svaret

    Svar

    För framtida referens:

    För att undertrycka dd-utdata omdirigerar stderr helt till / dev / null så:

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

    Det här fungerar bra om du till exempel vill göra en tidpunkt för processen med hjälp av tidskommandot i bash och tilldela resultatet till en variabel utan att få någon av utdata som dd producerar.

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

    Svar

    Något liknande bör också fungera för dig med de senaste versionerna av BASH och ZSH:

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

    P.S. Detta är bara ett exempel jag sprang …

    Svar

    Med valfritt Unix-program eller kommando kan du undertrycka all utdata med

    cmd >/dev/null 2>&1

    Den första biten omdirigerar standardutmatningen (enhetsnummer 1) till / dev / null. Men du behöver den andra delen för att även omdirigera felutmatningen (enhet nummer 2) till samma plats som nummer 1.

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


    Kommentarer

    • Egentligen stderr har filbeskrivaren 2 . (Jag antar att ” STDERR = 3 ” är bara ett stavfel.)
    • Det är inte önskvärt att undertrycka all produktion . Om ett fel inträffar vill vi se felmeddelandet.
    • cmd 2>logfile.txt verkar mer anpassat

    Svar

    Om jag förstår rätt vad du försöker göra, lägger du det sudo kommandot i skriptet och förväntar dig skriptet för att be om ditt lösenord när det körs där? I så fall gör du bara saker på det komplicerade sättet.

    En renare lösning är att skriva manuset på vanligt sätt (dvs. utan sudo) och kör den som superanvändare . Anledningen bakom detta är att om manuset behöver superanvändaråtkomst, ge det bara åtkomst (varför vänta tills ett visst kommando?). För att kontrollera om det körs som root gör du något liknande i skriptet:

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

    Kommentarer

    • nej. Att ’ är precis vad jag inte vill ’. Jag vill inte ’ att manuset ska köras som root bara för att jag inte ’ vill att dd ska visa utdata. Din kontroll skulle korrigeras om jag vill att manuset ska köras som superanvändare.
    • @dierre Så varför behövde du sudo i första hand? Normala användare borde kunna omdirigera saker till /dev/null bra.
    • Jag ’ m använder Ubuntu och det ’ är inte tillåtet … uhm …
    • Jag ’ beklagar. Jag märkte inte ’ att jag skapade något under / dev /. Manuset är inte mitt, jag redigerade det. Jag ’ är ledsen.

    Svar

    du kan omdirigera utdata till en vanlig fil, dvs:

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

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *