Jak wyłączyć wyjście dd?

Mam skrypt bash, który tworzy jakiś plik przy użyciu dd. Problem polega na tym, że dd generuje dużą ilość danych wyjściowych, które będą zepsuć dane wyjściowe mojego skryptu. Przeszukując okolice, znalazłem rozwiązanie:

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

Czy istnieje alternatywa lub przekierowywanie do /dev/null jedyny sposób?

Komentarze

  • I ' zagubiłem się w ostatnim zdaniu, ” skrypt nie powinien żądać uprawnień „. To nie ' nie wydaje się mieć nic wspólnego z przekierowanie do /dev/null – ' ponownie sudoing, ponieważ dd potrzebuje dostępu do zapisu do /dev/r$temp1 (zakładam). ' będziesz musiał to zrobić bez względu na to, jak stłumisz dd ' wyjście s; przekierowanie wyjścia do /dev/null nie ' t wymaga roota
  • I ' m idiota. Podawał operację niedozwoloną z powodu użycia / dev / r $ temp1 /. I

bardzo mi przykro. ' edytuję skrypt, który ' nie jest mój i nie ' nie zauważyłem . Naprawdę przepraszam.

  • więc problem polega na tym, że zwykły użytkownik nie może pisać do / dev / r $ temp1 ani do dev / null
  • Don ' martwić się o to; Zmodyfikowałem go trochę, aby usunąć mylącą część
  • Jeśli ' nie używasz żadnego z dd ' s zaawansowanych funkcji, zamiast tego użyj cat, head lub tail.
  • Odpowiedź

    Ze strony podręcznika dd(1):

     status=noxfer suppress transfer statistics 

    w ten sposób:

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

    To nadal wyświetla

    0+1 records in 0+1 records out 

    śmieci, gdy dd kończy działanie, więc przekierowanie do ujścia danych jest naprawdę jedyną opcją.

    Komentarze

    • to ja ' boję się.
    • Wierzę, że status = noxfer, może być powiązany z sygnałem SIGUSR1, który normalnie pokazuje transfer Statystyczny. Jednak nie chcę sprawdzać, czy ' to prawda.

    Odpowiedź

    Dodaj status=none:

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

    Z dd (coreutils) 8.21 dokumentów :

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

    Komentarze

    • @roaima – po prostu ciekawy, dlaczego edytujesz cytat ze strony podręcznika?
    • @don_crissti Czułem, że (brak) kontekstu w wyodrębnianiu cytatu ze strony podręcznika oznacza, że wymaga to nieco innej formy słów. W obecnej formie na stronie podręcznika ' jest w porządku; tutaj wyglądało to dziwnie.
    • @roaima – w porządku – zaspokojona ciekawość 🙂 – ale pamiętaj, że łączysz się z info page; początkowa odpowiedź zawierała dokładny cytat z man page . Chciałbym skopiować / wkleić bezpośrednio ze strony info, gdyby strona man była niejednoznaczna, ale tak naprawdę to zależy od Ciebie … Och, przy okazji, bardzo dziękuję za inny komentarz dotyczący mojej odpowiedzi związanej z sortowaniem według dni tygodnia.
    • Nie ' t wydaje się być dostępny w dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO To powinna być zaakceptowana odpowiedź

    Odpowiedź

    Do wykorzystania w przyszłości:

    Aby całkowicie zablokować wyjście dd, przekieruj stderr do / dev / null w ten sposób:

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

    Działa to dobrze, jeśli chcesz, na przykład, zmierzyć czas procesu za pomocą polecenia time w bash i przypisać wynik do zmiennej, bez uzyskiwania żadnego wyniku, który generuje dd.

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

    Odpowiedź

    Coś takiego powinno również działać w przypadku ostatnich wersji BASH i ZSH:

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

    P.S. To jest tylko przykład, który przeprowadziłem …

    Odpowiedź

    Za pomocą dowolnej aplikacji lub polecenia Uniksa można ukryć wszystkie dane wyjściowe

    cmd >/dev/null 2>&1

    Pierwszy bit przekierowuje standardowe wyjście (jednostka numer 1) do / dev / null. Ale potrzebujesz drugiej części, aby RÓWNIEŻ przekierować wyjście błędu (jednostka numer 2) w to samo miejsce co numer 1.

    W systemie UNIX STDIN = 0, STDOUT = 1 i STDERR = 2


    Komentarze

    • Właściwie stderr ma deskryptor pliku 2 . (Zakładam, że ” STDERR = 3 ” to zwykła literówka).
    • Nie jest pożądane, aby ukrywać wszystkie dane wyjściowe . Jeśli wystąpi błąd, chcielibyśmy zobaczyć komunikat o błędzie.
    • cmd 2>logfile.txt wydaje się lepiej przystosowany.

    Odpowiedz

    Jeśli dobrze rozumiem, co próbujesz zrobić, czy umieszczasz to polecenie sudo w skrypcie i oczekujesz skrypt, który zapyta o hasło, gdy jest tam uruchomiony? W takim przypadku robisz wszystko w skomplikowany sposób.

    Czystszym rozwiązaniem jest napisanie skryptu w zwykły sposób (tj. Bez sudo) i uruchom go jako superużytkownik . Powodem tego jest to, że jeśli skrypt wymaga dostępu superużytkownika, po prostu daj mu dostęp (po co czekać na określone polecenie?). W skrypcie, aby sprawdzić, czy jest uruchamiany jako root, wykonaj coś takiego:

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

    Komentarze

    • nie. To ' jest dokładnie tym, czego nie ' nie chcę robić. Nie ' nie chcę, aby skrypt był uruchamiany tylko jako root, ponieważ ' nie chcę, aby dd wyświetlał dane wyjściowe. Twój test poprawiłby się, jeśli chcę, aby skrypt był uruchamiany jako superużytkownik.
    • @dierre Dlaczego więc w pierwszej kolejności potrzebujesz sudo? Zwykli użytkownicy powinni mieć możliwość przekierowania rzeczy do /dev/null w porządku.
    • Ja ' m używając Ubuntu i to ' nie daje mi operacji … uhm …
    • I ' przepraszam. Nie ' nie zauważyłem, że tworzę coś w / dev /. Skrypt nie jest mój, redagowałem go. ' bardzo mi przykro.

    Odpowiedź

    możesz przekieruj wyjście do zwykłego pliku, tj .:

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

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *