Как подавить вывод dd?

35

У меня есть сценарий Bash, который создает некоторые файлы с помощью dd. Проблема в том, что dd генерирует большое количество выходных данных, которые будут мешать выводу моего скрипта. Обыскивая, я нашел решение:

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

Есть ли альтернатива, или перенаправление /dev/nullна единственный путь?

Dierre
источник
3
Я потерял последнее предложение: «Скрипт не должен запрашивать привилегии». Похоже, это не имеет никакого отношения к перенаправлению на /dev/null- вы судите, потому что вам ddнужен доступ для записи /dev/r$temp1(я полагаю). Вам нужно будет делать это независимо от того, как вы подавляете ddвывод; перенаправление вывода на /dev/nullне требует root
Майкл Мрозек
Я идиот. Операция была запрещена из-за использования / 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выходе, так что перенаправление на приемник данных на самом деле ваш единственный вариант.

amphetamachine
источник
это было то, чего я боюсь
dierre
Я полагаю, что status = noxfer, может быть связано с сигналом SIGUSR1, который обычно показывает статистику передачи. Однако я не желаю проверять, верно ли то, что я говорю.
Maxadamo
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.
orgoj
источник
@roaima - просто любопытно, зачем редактировать цитату со страницы руководства?
don_crissti
@don_crissti Я чувствовал (отсутствие) контекста при извлечении цитаты из страницы руководства, что это требовало немного другой формы слов. Пока он стоит на странице руководства, все в порядке; здесь это выглядело странно.
Роайма
@roaima - все в порядке - любопытство удовлетворено :) - но обратите внимание, что вы ссылаетесь на info page; первоначальный ответ здесь содержал точную цитату из man page. Я бы скопировал / вставил прямо со infoстраницы, если manстраница неоднозначная, но на самом деле, до вас ... О, кстати, большое спасибо за ваш другой комментарий на мой ответ, связанный с сортировкой по дням недели.
don_crissti
@don_crissti Я не смог найти страницу в Интернете с цитатой; спасибо за это. (die.net имеет старшее ddбез status=)
Роайма
3
Кажется, не доступен в dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg
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

CSCH
источник
2

Нечто подобное должно работать и у вас с последними версиями BASH и ZSH:

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

PS Это всего лишь пример, который я побежал ...

Slashdot
источник
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
phunehehe
источник
Нет. Это именно то, что я не хочу делать. Я не хочу, чтобы скрипт запускался как root, потому что я не хочу, чтобы dd отображал вывод. Ваша проверка будет исправлена, если я хочу, чтобы скрипт запускался как суперпользователь.
dierre
@dierre Так зачем ты вообще нужен sudo? Обычные пользователи должны иметь возможность перенаправлять вещи /dev/nullпросто отлично.
phunehehe
Я использую Ubuntu, и он не позволяет мне работать ... хм ...
dierre
Мне жаль. Я не заметил, что я создаю что-то в / dev /. Сценарий не мой, я его редактировал. Мне, действительно, жаль.
Dierre
0

Вы можете перенаправить вывод в обычный файл, т.е.

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
реактивный самолет
источник