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.
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
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:
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.
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
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