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 är verkligen ledsen. Jag ’ redigerar ett skript som ’ inte är mitt och märkte inte ’ . Verkligen ledsen.
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ånman page
. Jag skulle ha kopierat / klistrat in direkt fråninfo
-sidan omman
-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
/dev/null
– du ’ sudoing eftersomdd
behöver skrivåtkomst till/dev/r$temp1
(antar jag). Du ’ kommer att behöva göra det oavsett hur du undertryckerdd
’ s output; omdirigera output till/dev/null
kräver inte ’ t root