Як придушити вихід DD?


35

У мене є скрипт bash, який створює якийсь файл за допомогою dd. Проблема полягає в тому, що ДД кидає велику кількість результатів, які зіпсуються з результатами мого сценарію. Шукаючи навколо, я знайшов рішення:

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

Чи є альтернатива чи переадресація на /dev/nullєдиний шлях?


3
Я втрачений у вашому останньому реченні: "сценарій не повинен просити пільги". Це, мабуть, не має нічого спільного з перенаправленням на /dev/null- ви судозуєтесь, тому що вам ddпотрібен доступ до запису /dev/r$temp1(я припускаю). Вам потрібно буде це робити незалежно від того, як ви придушите ddвихід; для переадресації виводу /dev/nullне потрібен root
Michael Mrozek

Я ідіот. Ця операція не дозволяється через використання / dev / r $ temp1 /. Мені дуже шкода. Я редагую сценарій, який не є моїм, і не помітив його. Дійсно шкода.
dierre

тому проблема в тому, що звичайний користувач не може писати в / dev / r $ temp1 або в dev / null
jet

Не хвилюйтеся з цього приводу; Я трохи відредагував це, щоб видалити заплутану частину
Майкл Мрозек

1
Якщо ви не використовуєте який - або з Д.Д. додаткові функції, використання cat, headабо tailзамість цього.
Жил 'ТАК - перестань бути злим'

Відповіді:


16

На dd(1)чоловіковій сторінці:

   status=noxfer
          suppress transfer statistics

таким чином:

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

Це все ще виводить

0+1 records in
0+1 records out

сміття під час ddвиходу, тому перенаправлення на мийку даних - це єдиний ваш варіант.


цього я боявся.
dierre

Я вважаю, що статус = noxfer, може бути пов'язаний з сигналом SIGUSR1, які зазвичай показують статистику передачі. Однак я не бажаю перевіряти, чи правда це те, що я говорю.
Макадамо

54

Додати status=none:

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

Від 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 - просто цікаво, навіщо редагувати цитату зі сторінки man?
don_crissti

@don_crissti Я відчув, що (відсутність) контексту для вилучення цитати зі сторінки man означає, що для неї потрібна дещо інша форма слів. Як це стоїть на сторінці чоловіка, це добре; тут це виглядало дивно.
roaima

@roaima - все в порядку - цікавість задоволена :) - але зауважте, що ви посилаєтесь на info page; початкова відповідь тут мала точну цитату з man page. Я б скопіював / вставив прямо зі infoсторінки, якщо manсторінка неоднозначна, але насправді, залежить від вас ... О, btw, дякую за ваш інший коментар до моєї відповіді щодо сортування за тижнями.
don_crissti

@don_crissti Я не зміг знайти сторінку в Інтернеті, на якій була цитата; дякую за це. (die.net має старших ddбез status=)
roaima

3
Здається, це не доступно в dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Пер Лундберг

5

Для подальшого ознайомлення:

Щоб придушити вихід dd повністю перенаправити stderr на / dev / null так:

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

Це добре спрацьовує, якщо ви хочете, наприклад, обробити процес, використовуючи команду time у bash та призначити результат змінній, не отримуючи жодного результату, який видає dd.

довідка: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html


2

Щось подібне також має працювати для вас із останніми версіями BASH та ZSH:

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

PS Це лише приклад, який я побіг ...


2

За допомогою будь-якого додатка або команди Unix ви можете придушити весь вихід

cmd >/dev/null 2>&1

Перший біт перенаправляє стандартний вихід (номер одиниці 1) на / dev / null. Але вам потрібна друга частина, щоб ТАКОЖ перенаправити вихід помилки (блок №2) на те саме місце, що і номер 1.

У UNIX STDIN = 0, STDOUT = 1 і STDERR = 2



1
Власне, stderrмає дескриптор файлів 2 . (Я припускаю, що "STDERR = 3" - це просто друкарська помилка.)
n.st

1
Небажано придушувати весь вихід. Якщо виникла помилка, ми хотіли б побачити повідомлення про помилку.
Сем Уоткінс

cmd 2>logfile.txtздається більш адаптованим
TheSola10

0

Якщо я правильно зрозумів, що ви намагаєтеся зробити, ви вводите цю sudoкоманду в сценарій і очікуєте, що скрипт підкаже ваш пароль, коли він працює там? У такому випадку ви просто робите речі складним чином.

Більш чітке рішення - написати сценарій звичайним способом (тобто без sudo) та запустити його як суперпользователь . Причина цього полягає в тому, що якщо скрипту потрібен суперпользовательский доступ, тоді просто надайте йому доступ (навіщо чекати певної команди?). У сценарії, щоб перевірити, чи він запускається як root, зробіть щось подібне:

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

ніпе. Саме це я не хочу робити. Я не хочу, щоб сценарій запускався як root тільки тому, що я не хочу, щоб dd відображало вихід. Ваш чек буде правильним, якщо я хочу, щоб сценарій запускався як суперпользователь.
dierre

@dierre Тож навіщо вам це потрібно було sudoв першу чергу? Звичайні користувачі повинні мати можливість перенаправляти речі на /dev/nullчудово.
phunehehe

Я використовую Ubuntu, і це дає мені операцію не дозволену ... uhm ...
dierre

Мені шкода. Я не помітив, що щось створюю під / dev /. Сценарій не мій, я його редагував. Мені дуже шкода.
dierre

0

Ви можете переспрямувати вихід у звичайний файл, тобто:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.