Jak ukryć wyjście dd?

35

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ą popsuć dane wyjściowe mojego skryptu. Rozglądając się, znalazłem rozwiązanie:

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

Czy istnieje alternatywa lub przekierowanie /dev/nullna jedyny sposób?

dierre
źródło
3
Zgubiłem się w ostatnim zdaniu: „skrypt nie powinien prosić o uprawnienia”. Wydaje się, że nie ma to nic wspólnego z przekierowywaniem do /dev/null- sudo, ponieważ ddpotrzebuje dostępu do zapisu /dev/r$temp1(zakładam). Musisz to zrobić bez względu na to, jak tłumisz ddwyniki; przekierowanie wyjścia do /dev/nullnie wymaga roota
Michael Mrozek
Jestem idiotą. Dała operację niedozwoloną z powodu użycia / dev / r $ temp1 /. Bardzo przepraszam. Edytuję skrypt, który nie jest mój i nie zauważyłem go. Naprawdę przykro.
dierre 31.01.11
więc problem polega na tym, że zwykły użytkownik nie może pisać do / dev / r $ temp1 lub do dev / null
jet
Nie martw się o to; Trochę go zredagowałem, żeby usunąć mylącą część
Michaela Mrożka
1
Jeśli nie używasz żadnego z DD zaawansowanych funkcji, stosowanie cat, headlub tailzamiast tego.
Gilles „SO- przestań być zły”

Odpowiedzi:

16

Ze strony podręcznika dd(1):

   status=noxfer
          suppress transfer statistics

a zatem:

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

Nadal wyświetla to

0+1 records in
0+1 records out

śmieci po ddwyjściu, więc przekierowanie do ujścia danych jest naprawdę jedyną opcją.

amfetamachina
źródło
tego się boję.
dzień
Uważam, że status = noxfer, może być związany z sygnałem SIGUSR1, który normalnie pokazuje statystykę transferu. Jednak nie chcę testować, czy to prawda, co mówię.
maxadamo
54

Dodaj status=none:

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

Z dokumentów dd (coreutils) 8.21 :

'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.
orgoj
źródło
@roaima - po prostu ciekawi, po co edytować cytat ze strony podręcznika?
don_crissti
@don_crissti Czułem (brak) kontekstu w wydobywaniu cytatu ze strony podręcznika oznacza, że ​​wymagało to nieco innej formy słów. Jak stoi na stronie podręcznika, jest w porządku; tutaj wyglądało to dziwnie.
roaima,
@roaima - w porządku - ciekawość zaspokojona :) - ale pamiętaj, że link do info page; pierwotna odpowiedź tutaj miała dokładny cytat z man page. Skopiowałbym / wkleiłbym bezpośrednio ze infostrony, jeśli manstrona jest niejednoznaczna, ale tak naprawdę zależy od ciebie ... Och, dziękuję bardzo za twój inny komentarz do mojej odpowiedzi dotyczącej sortowania według dnia tygodnia.
don_crissti
@don_crissti Nie mogłem znaleźć strony podręcznika online z cytatem; dziękuję za to. (die.net ma starsze ddbez status=)
roaima,
3
Nie wydaje się być dostępny w dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg
5

Dla przyszłego odniesienia:

Aby stłumić wyjście dd całkowicie przekieruj stderr do / dev / null w następujący 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ą komendy time w bash i przypisać wynik do zmiennej, bez uzyskiwania danych wyjściowych dd.

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

CSCH
źródło
2

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

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

PS To tylko przykład, który uruchomiłem ...

slashdot
źródło
2

Za pomocą dowolnej aplikacji lub polecenia Uniksa możesz pomijać wszystkie dane wyjściowe za pomocą

cmd >/dev/null 2>&1

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

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


Michael Dillon
źródło
1
W rzeczywistości stderrma deskryptor pliku 2 . (Zakładam, że „STDERR = 3” to tylko literówka.)
n.st.
1
Niepożądane jest tłumienie całej mocy wyjściowej. Jeśli wystąpi błąd, chcielibyśmy zobaczyć komunikat o błędzie.
Sam Watkins,
cmd 2>logfile.txtwydaje się bardziej dostosowany
TheSola10
0

Jeśli dobrze rozumiem, co próbujesz zrobić, czy umieszczasz to sudopolecenie w skrypcie i oczekujesz, że skrypt wyświetli monit o podanie hasła, gdy zostanie uruchomione? W takim przypadku po prostu robisz rzeczy w skomplikowany sposób.

Bardziej przejrzystym rozwiązaniem jest napisanie skryptu w zwykły sposób (tj. Bez sudo) i uruchomienie go jako administratora . Powodem tego jest to, że jeśli skrypt wymaga dostępu administratora, to 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
phunehehe
źródło
nie. Właśnie tego nie chcę robić. Nie chcę, aby skrypt był uruchamiany tylko jako root, ponieważ nie chcę, aby dd wyświetlał dane wyjściowe. Twój czek byłby poprawny, jeśli chcę, aby skrypt był uruchamiany jako administrator.
dzień
@ dierre Dlaczego więc w ogóle potrzebujesz sudo? Normalni użytkownicy powinni mieć możliwość przekierowywania rzeczy na /dev/nulldobre.
phunehehe
Używam Ubuntu i daje mi to operację niedozwoloną ... uhm ...
dierre 31.01.11
Przepraszam. Nie zauważyłem, że tworzę coś w / dev /. Skrypt nie jest mój, edytowałem go. Bardzo przepraszam.
dierre 31.01.11
0

możesz przekierować dane wyjściowe do zwykłego pliku, tj .:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
strumień
źródło