Jak potlačím výstup dd?

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

  • jsem ‚ m ztracen na poslední větě, “ skript by neměl vyžadovat oprávnění „. Zdá se, že ‚ nemá nic společného s přesměrování na /dev/null – vy ‚ znovu sudoujete, protože dd potřebuje přístup pro zápis do /dev/r$temp1 (předpokládám). ‚ budete to muset udělat bez ohledu na to, jak dd ‚ s výstup; přesměrování výstupu na /dev/null nevyžaduje ‚ kořen
  • I ‚ jsem idiot. Dával operaci nepovolenou z důvodu použití / dev / r $ temp1 /. I

je mi to opravdu líto. ‚ upravuji skript, který ‚ není můj a nezjistil jsem to ‚ . Opravdu se omlouvám.

  • takže problém je v tom, že běžný uživatel nemůže zapisovat do / dev / r $ temp1 nebo do dev / null
  • Don ‚ nedělejte si s tím starosti; Trochu jsem to upravil, abych odstranil zmatenou část
  • Pokud ‚ nepoužíváte žádný z dd ‚ s pokročilé funkce, použijte místo toho 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 z man page . Pokud je stránka man nejednoznačná, ale opravdu na vás … Oh, zkopíroval bych / vložil přímo ze stránky info 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 

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *