Mám bash skript, který vytváří nějaký soubor pomocí dd
. Problém je v tom, že dd hodí velké množství výstupu, který se bude hýbat s výstupem mého skriptu. Při hledání jsem našel řešení:
dd if=boot1h of="/dev/r$temp1" >& /dev/null
Existuje alternativa nebo přesměrování na /dev/null
jediný způsob?
Komentáře
je mi to opravdu líto. ‚ upravuji skript, který ‚ není můj a nezjistil jsem to ‚ . Opravdu se omlouvám.
cat
, head
nebo tail
. Odpověď
Na stránce dd(1)
:
status=noxfer suppress transfer statistics
tedy:
dd if=boot1h of="/dev/r$temp1" status=noxfer
Tím se stále vygeneruje
0+1 records in 0+1 records out
odpadky při ukončení dd
, takže přesměrování do jímky dat je opravdu vaše jediná možnost.
Komentáře
- které jsem se ‚ bojím.
- Věřím, že status = noxfer, může souviset se signálem SIGUSR1, které normálně ukazují přenos statistický. Hoewever, nejsem ochoten testovat, zda je ‚ pravda, co říkám.
Odpověď
Přidat status=none
:
dd if=boot1h of="/dev/r$temp1" status=none
Z dd (coreutils) 8.21 dokumentů :
"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.
Komentáře
- @roaima – jen zvědavý, proč editovat citát z manuálové stránky?
- @don_crissti Cítil jsem, že (nedostatek) kontextu při extrahování citátu z manuálové stránky znamená, že to vyžaduje trochu jinou formu slov. Jak to stojí na manuálové stránce , je to ‚ v pořádku; tady to vypadalo divně.
- @roaima – dobře – zvědavost spokojena 🙂 – ale všimněte si, že odkazujete na
info page
; počáteční odpověď zde měla přesnou nabídku zman page
. Pokud je stránkaman
nejednoznačná, ale opravdu na vás … Oh, zkopíroval bych / vložil přímo ze stránkyinfo
btw, moc děkuji za váš další komentář k mé odpovědi týkající se třídění podle dne v týdnu. - Zdá se, že ‚ t není k dispozici v dd (coreutils) 8.13:
dd: invalid status flag: `none' Try `dd --help' for more information.
- IMO Toto by měla být přijatá odpověď
Odpověď
Pro budoucí použití:
Chcete-li úplně potlačit výstup dd, přesměrujte stderr na / dev / null takto:
dd if=/dev/urandom of=sample.txt bs=5MB count=1 2> /dev/null
To funguje dobře, pokud chcete například načasovat proces pomocí příkazu time v bash a přiřadit výsledek proměnné, aniž byste dostali jakýkoli výstup, který dd produkuje.
reference: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html
odpověď
Něco podobného by pro vás mělo fungovat i s nejnovějšími verzemi BASH a ZSH:
dd if=/path/to/file of=/path/to/another_file bs=1M count=1 &> /dev/null
P.S. Toto je jen příklad, který jsem spustil …
Odpověď
S jakoukoli unixovou aplikací nebo příkazem můžete potlačit veškerý výstup pomocí
cmd >/dev/null 2>&1
První bit přesměruje standardní výstup (číslo jednotky 1) na / dev / null. Ale potřebujete, aby druhá část také přesměrovala chybový výstup (jednotka číslo 2) na stejné místo jako číslo 1.
V systému UNIX, STDIN = 0, STDOUT = 1 a STDERR = 2
Komentáře
- Ve skutečnosti
stderr
má deskriptor souboru 2 . (Předpokládám, že “ STDERR = 3 “ je jen překlep.) - Je nežádoucí potlačit veškerý výstup . Pokud dojde k chybě, chtěli bychom zobrazit chybovou zprávu.
-
cmd 2>logfile.txt
se zdá přizpůsobenější
Odpověď
Pokud správně chápu, o co se snažíte, vkládáte do skriptu tento příkaz sudo
a očekáváte skript vyzvat k zadání hesla, když tam běží? V tom případě děláte věci komplikovaně.
Čistší řešení je napsat skript obvyklým způsobem (tj. Bez sudo
) a spusťte jej jako superuživatele . Důvodem je to, že pokud skript potřebuje přístup superuživatele, stačí mu dát přístup (proč čekat na určitý příkaz?). Ve skriptu zkontrolujte, zda je spuštěn jako root, něco takového:
if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi
Komentáře
- ne. To ‚ je přesně to, co nechci ‚ dělat. Nechci ‚ chci, aby byl skript spuštěn pouze jako root, protože ‚ nechci, aby dd zobrazoval výstup. Vaše kontrola se opraví, pokud chci, aby byl skript spuštěn jako superuživatel.
- @dierre Proč jste tedy vůbec potřebovali
sudo
? Normální uživatelé by měli být schopni přesměrovat věci na/dev/null
v pohodě. - I ‚ m pomocí Ubuntu a toho ‚ mi operace není povolena … uhm …
- Omlouvám se ‚. Nevšiml jsem si ‚, že něco vytvářím pod / dev /. Skript není můj, upravoval jsem ho. Je mi ‚ opravdu líto.
Odpovědět
můžete přesměrovat výstup do běžného souboru, tj .:
dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
/dev/null
– vy ‚ znovu sudoujete, protožedd
potřebuje přístup pro zápis do/dev/r$temp1
(předpokládám). ‚ budete to muset udělat bez ohledu na to, jakdd
‚ s výstup; přesměrování výstupu na/dev/null
nevyžaduje ‚ kořen