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
bardzo mi przykro. ' edytuję skrypt, który ' nie jest mój i nie ' nie zauważyłem . Naprawdę przepraszam.
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 zman page
. Chciałbym skopiować / wkleić bezpośrednio ze stronyinfo
, gdyby stronaman
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
/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łumiszdd
' wyjście s; przekierowanie wyjścia do/dev/null
nie ' t wymaga roota