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?


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


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.

@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


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


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



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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.