Comment puis-je supprimer la sortie DD?

35

J'ai un script bash qui crée un fichier en utilisant dd. Le problème est que dd jette une grande quantité de sortie qui va gâcher la sortie de mon script. En cherchant, j'ai trouvé une solution:

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

Existe-t-il une alternative ou est-ce que la redirection est /dev/nullla seule?

dierre
la source
3
Je suis perdu sur votre dernière phrase, "le script ne doit pas demander de privilèges". Cela ne semble pas avoir rien à voir avec la redirection vers /dev/null- vous êtes soudain parce que vous avez ddbesoin d'un accès en écriture /dev/r$temp1(je suppose). Vous allez avoir besoin de le faire, peu importe comment vous supprimez ddla sortie; la redirection de la sortie vers /dev/nullne nécessite pas de racine
Michael Mrozek
Je suis un idiot. Cela donnait une opération non autorisée à cause de l'utilisation de / dev / r $ temp1 /. Je suis vraiment désolé. J'édite un script qui n'est pas le mien et je ne l'ai pas remarqué. Désolé.
dierre le
le problème est que l'utilisateur normal ne peut pas écrire dans / dev / r $ temp1 ou dev / null
jet le
Ne t'inquiète pas pour ça Je l'ai un peu modifié pour supprimer la partie source de confusion
Michael Mrozek
1
Si vous ne l' utilisez l' une des dd est des fonctionnalités avancées, l' utilisation cat, headou au taillieu.
Gilles 'SO- arrête d'être méchant'

Réponses:

16

De la dd(1)page de manuel:

   status=noxfer
          suppress transfer statistics

Ainsi:

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

Ceci produit toujours le

0+1 records in
0+1 records out

ordures lors de la ddsortie, la redirection vers un collecteur de données est donc votre seule option.

amphétamachine
la source
c'était j'ai peur de.
dierre le
Je crois que status = noxfer, pourrait être lié au signal SIGUSR1, qui montre normalement la statistique de transfert. Cependant, je ne suis pas disposé à vérifier si ce que je dis est vrai.
maxadamo
54

Ajouter status=none:

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

Du dd (coreutils) 8.21 docs :

'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
la source
@roaima - juste curieux, pourquoi éditer une citation de la page de manuel?
don_crissti
@don_crissti J'ai senti que le contexte (inexistant) dans l'extraction de la citation de la page de manuel signifiait que cela nécessitait une forme de mots légèrement différente. Comme cela se trouve dans la page de manuel, ça va; ici, ça avait l'air étrange.
roaima
@roaima - d'accord - curiosité satisfaite :) - mais notez que vous créez un lien vers le info page; la réponse initiale ici avait la citation exacte de la man page. Je l'aurais copié / collé directement à partir de la infopage si la manpage était ambiguë, mais vraiment, à vous de décider ... Oh, au fait, merci beaucoup pour votre autre commentaire sur ma réponse concernant le tri par jour de la semaine.
don_crissti
@don_crissti Je n'ai pas trouvé de page de manuel en ligne contenant la citation; merci pour celui-là. (die.net a le plus vieux ddsans status=)
roaima
3
Ne semble pas être disponible en jj (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg
5

Pour référence future:

Pour supprimer complètement la sortie dd, redirigez stderr vers / dev / null comme suit:

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

Cela fonctionne bien si vous souhaitez, par exemple, chronométrer le processus à l'aide de la commande time dans bash et affecter le résultat à une variable, sans obtenir aucune des sorties générées par dd.

référence: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html

CSCH
la source
2

Quelque chose comme cela devrait également fonctionner pour vous avec les versions récentes de BASH et ZSH:

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

PS Ceci est juste un exemple que j'ai couru ...

slashdot
la source
2

Avec toute application ou commande Unix, vous pouvez supprimer toutes les sorties avec

cmd >/dev/null 2>&1

Le premier bit redirige la sortie standard (numéro d'unité 1) vers / dev / null. Mais vous avez besoin de la deuxième partie pour AUSSI rediriger la sortie d'erreur (numéro d'unité 2) vers le même endroit que le numéro 1.

Sous UNIX, STDIN = 0, STDOUT = 1 et STDERR = 2


Michael Dillon
la source
1
En fait, stderra le descripteur de fichier 2 . (Je suppose que "STDERR = 3" est juste une faute de frappe.)
n.st
1
Il n'est pas souhaitable de supprimer toutes les sorties. Si une erreur survient, nous aimerions voir le message d'erreur.
Sam Watkins
cmd 2>logfile.txtsemble plus adapté
TheSola10 21/0417
0

Si je comprends bien ce que vous essayez de faire, sudoinsérez- vous cette commande dans le script et attendez-vous à ce qu'il vous demande votre mot de passe lorsqu'il s'exécute? Dans ce cas, vous ne faites que des choses compliquées.

Une solution plus propre consiste à écrire le script de la manière habituelle (c'est-à-dire sans sudo) et à l' exécuter en tant que superutilisateur . La raison derrière cela est que, si le script nécessite un accès superutilisateur, donnez-lui simplement l'accès (pourquoi attendre jusqu'à une certaine commande?). Dans le script, pour vérifier s'il est exécuté en tant que root, procédez comme suit:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi
phunehehe
la source
Nan. C'est exactement ce que je ne veux pas faire. Je ne veux pas que le script soit exécuté en tant que root uniquement parce que je ne veux pas que dd affiche le résultat. Votre chèque sera corrigé si je veux que le script soit exécuté en tant que superutilisateur.
dierre le
@dierre Alors pourquoi avez-vous eu besoin sudoen premier lieu? Les utilisateurs normaux devraient pouvoir rediriger les choses /dev/nulltrès bien.
Phunehehe
J'utilise Ubuntu et ça me donne une opération non autorisée ... euh ...
dierre le
Je suis désolé. Je n'ai pas remarqué que je créais quelque chose sous / dev /. Le script n'est pas le mien, je le montais. Je suis vraiment désolé.
dierre le
0

vous pouvez rediriger la sortie vers un fichier normal, à savoir:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
jet
la source