¿Cómo suprimo la salida dd?

35

Tengo un script bash que crea algunos archivos usando dd. El problema es que dd arroja una gran cantidad de salida que va a interferir con la salida de mi script. Buscando alrededor he encontrado una solución:

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

¿Existe alguna alternativa o se está redirigiendo a /dev/nullla única forma?

dierre
fuente
3
Estoy perdido en su última oración, "el script no debe solicitar privilegios". Eso no parece tener nada que ver con redirigir a /dev/null: estás suplantando porque ddnecesita acceso de escritura /dev/r$temp1(supongo). Necesitará hacerlo sin importar cómo suprima ddla salida; redirigir la salida a /dev/nullno requiere root
Michael Mrozek
Soy un idiota. Estaba dando una operación no permitida debido al uso de / dev / r $ temp1 /. Lo siento mucho. Estoy editando un guión que no es mío y no lo noté. Lo siento mucho.
Dierre
así que el problema es que el usuario normal no puede escribir en / dev / r $ temp1 o en dev / null
jet
No te preocupes por eso; Lo edité un poco para eliminar la parte confusa
Michael Mrozek
1
Si usted no está usando cualquiera de DD características avanzadas, el uso cat, heado tailen su lugar.
Gilles 'SO- deja de ser malvado'

Respuestas:

16

Desde la dd(1)página del manual:

   status=noxfer
          suppress transfer statistics

así:

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

Esto todavía genera el

0+1 records in
0+1 records out

basura cuando ddsale, por lo que redirigir a un sumidero de datos es realmente su única opción.

anfetamaquina
fuente
de eso tenía miedo.
Dierre
Creo que status = noxfer, podría estar relacionado con la señal SIGUSR1, que normalmente muestra la estadística de transferencia. Sin embargo, no estoy dispuesto a probar si es verdad lo que estoy diciendo.
maxadamo
54

Añadir status=none:

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

Desde los documentos 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
fuente
@roaima: solo curiosidad, ¿por qué editar una cita de la página de manual?
don_crissti
@don_crissti Sentí que la (falta de) contexto al extraer la cita de la página del manual significaba que requería una forma de palabras ligeramente diferente. Tal como está en la página del manual , está bien; Aquí parecía extraño.
roaima
@roaima - está bien - curiosidad satisfecha :) - pero tenga en cuenta que tiene un enlace a la info page; La respuesta inicial aquí tenía la cita exacta de man page. Hubiera copiado / pegado directamente de la infopágina si la manpágina es ambigua, pero realmente, depende de usted ... Oh, por cierto, muchas gracias por su otro comentario sobre mi respuesta relacionada con la clasificación por días de la semana.
don_crissti
@don_crissti No pude encontrar una página de manual en línea que tuviera la cita; gracias por eso (die.net tiene el mayor ddsin status=)
roaima
3
No parece estar disponible en dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Según Lundberg
5

Para futura referencia:

Para suprimir la salida dd, redirija completamente stderr a / dev / null de esta manera:

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

Esto funciona bien si desea, por ejemplo, cronometrar el proceso utilizando el comando time en bash y asignar el resultado a una variable, sin obtener ninguno de los resultados que produce dd.

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

CSCH
fuente
2

Algo como esto también debería funcionar para usted con versiones recientes de BASH y ZSH:

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

PD: Este es solo un ejemplo que ejecuté ...

slashdot
fuente
2

Con cualquier aplicación o comando de Unix, puede suprimir todos los resultados con

cmd >/dev/null 2>&1

El primer bit redirige la salida estándar (número de unidad 1) a / dev / null. Pero necesita la segunda parte para redirigir TAMBIÉN la salida de error (número de unidad 2) al mismo lugar que el número 1.

En UNIX, STDIN = 0, STDOUT = 1 y STDERR = 2


Michael Dillon
fuente
1
En realidad, stderrtiene el descriptor de archivo 2 . (Supongo "STDERR = 3" es sólo un error tipográfico.)
n.st
1
No es deseable suprimir toda la salida. Si se produce un error, nos gustaría ver el mensaje de error.
Sam Watkins
cmd 2>logfile.txtparece más adaptado
TheSola10
0

Si entiendo correctamente lo que está tratando de hacer, ¿está poniendo ese sudocomando en el script y espera que el script solicite su contraseña cuando se ejecute allí? En ese caso, solo estás haciendo las cosas de la manera complicada.

Una solución más limpia es escribir el script de la manera habitual (es decir, sin sudo) y ejecutarlo como superusuario . La razón detrás de esto es que si la secuencia de comandos necesita acceso de superusuario, solo dale el acceso (¿por qué esperar hasta cierto comando?). En el script, para verificar si se está ejecutando como root, haga algo como esto:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi
phunehehe
fuente
no Eso es exactamente lo que no quiero hacer. No quiero que el script se ejecute como root solo porque no quiero que dd muestre el resultado. Su verificación corregirá si deseo que el script se ejecute como superusuario.
Dierre
@dierre Entonces, ¿por qué lo necesitabas sudoen primer lugar? Los usuarios normales deberían poder redirigir las cosas a la /dev/nullperfección.
phunehehe
Estoy usando Ubuntu y me está dando operación no permitida ... uhm ...
dierre
Lo siento. No me di cuenta de que estaba creando algo en / dev /. El guión no es mío, lo estaba editando. Lo siento mucho.
Dierre
0

puede redirigir la salida a un archivo normal, es decir:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
chorro
fuente