web-dev-qa-db-fra.com

redirection vers / dev / null

Je lis un exemple de script Shell bash:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another Host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

J'essaie de comprendre l'utilisation de "/ dev/null 2> & 1" ici. Au début, je pensais que ce script utilise/dev/null afin d'ignorer gracieusement les erreurs, sans provoquer le plantage du script (un peu comme essayer d'attraper la gestion des exceptions dans les langages de programmation). Parce que je ne vois pas comment l'utilisation de tar pour compresser un répertoire dans un fichier tar pourrait éventuellement provoquer tout type d'erreurs.

179
JohnMerlino

Non, cela n'empêchera pas le script de planter. Si des erreurs se produisent dans le processus tar (par exemple: autorisation refusée, aucun fichier ou répertoire, ...), le script se bloquera toujours.

Cela est dû à l'utilisation de > /dev/null 2>&1 redirigera toutes les sorties de vos commandes (stdout et stderr) vers /dev/null, ce qui signifie qu'aucune sortie n'est imprimée sur le terminal.

Par défaut:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

Dans le script, vous utilisez > /dev/null provoquant:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

Et alors 2>&1 provoquant:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout
266
cuonglm

J'essaie de comprendre l'utilisation de ">/dev/null 2> & 1" ici.

(notez que j'ai ajouté la redirection avant /dev/null dans votre question.)

Ce qui précède redirigerait les STDOUT et STDERR vers /dev/null. Il fonctionne en fusionnant le STDERR dans le STDOUT. (Essentiellement, toutes les sorties de la commande seraient redirigées vers périphérique nul .)

... sans provoquer le plantage du script (un peu comme essayer la gestion des exceptions catch dans les langages de programmation).

Ce n'est pas tout à fait comme un try/catch Ou n'importe quoi. Il suffit de désactiver toute sorte de sortie (y compris les erreurs) de la commande.

Parce que je ne vois pas comment l'utilisation de tar pour compresser un répertoire dans un fichier tar pourrait éventuellement provoquer tout type d'erreurs.

Cela pourrait entraîner des erreurs pour un certain nombre de raisons, notamment:

  • Autorisations inadéquates sur le ou les fichiers que vous essayez d'archiver ou sur le fichier que vous essayez d'écrire
  • Manque d'espace disque pour créer l'archive
23
devnull

Lorsque vous exécutez CMD>/dev/null 2> & 1

STDOUT redirige vers/dev/null, puis STDERR redirige vers L'ADRESSE de STDOUT, qui a été définie sur/dev/null, par conséquent STDOUT et STDERR pointent vers/dev/null

À l'opposé, lorsque vous exécutez CMD 2> & 1>/dev/null

STDERR redirige vers L'ADRESSE de STDOUT (descripteur de fichier 1 à ce moment, ou/proc/self/fd/1), puis STDOUT redirige vers/dev/null, mais STDERR continue de rediriger vers fd1 !! Par conséquent, la sortie normale de STDOUT est ignorée, mais les erreurs provenant de STDERR sont toujours en cours d'écriture sur la console.

15
hector

Pour comprendre facilement, écrivez-le explicitement. Voici un exemple de commande qui tente de supprimer un fichier inexistant:

rm nonexisting.txt 1>/dev/null 2>/dev/null
  • 1 est standard. Envoyer des journaux d'informations à/dev/null
  • 2 est stderr. Envoyer les journaux d'erreurs à/dev/null

Vous trouverez ci-dessous quelques améliorations (qui utilisent les valeurs par défaut et les pointeurs pour confondre tout le monde)

Amélioration 1: vous pouvez remplacer "1>" par seulement ">" (car "1" est la sortie standard par défaut)

 rm nonexisting.txt >/dev/null 2>/dev/null

Amélioration 2: Vous pouvez remplacer le 2ème "/ dev/null" par & 1 (le 2ème/dev/null est appelé & 1 car/dev/null est "déjà indiqué par stdout 1")

rm nonexisting.txt 1> /dev/null 2> &1
2
Thyag