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 utilisait / dev / null pour ignorer les erreurs sans provoquer le plantage du script (un peu comme essayer de gérer les exceptions dans les langages de programmation). Parce que je ne vois pas comment utiliser tar pour compresser un répertoire dans un fichier tar pourrait éventuellement provoquer tout type d'erreur.
bash-script
null
JohnMerlino
la source
la source
/dev/null
n'empêche pas le crash, mais nettoie les flux de sortie stdout et stderr.tar
pourrait causer des erreurs de diverses manières. Vous n'avez peut-être pas accès en écriture, le fichier existe peut-être déjà, etc.tar
n’est pas dans votre $ PATH, cartar
s'est écrasé (on ne sait jamais), car il ne reste plus d'espace sur le périphérique, car latar
version a changé et requiert une syntaxe différente, car le disque a provoqué une erreur d'E / S. Je suis sûr que vous pourriez en trouver plus.Réponses:
Non, cela n'empêchera pas le script de planter. Si des erreurs se produisent dans le
tar
processus (par exemple: permission refusée, aucun fichier ou répertoire de ce type, ...), le script se plante quand même.Parce que using
> /dev/null 2>&1
redirige toutes les sorties de votre commande (les deuxstdout
etstderr
) vers/dev/null
, ce qui signifie qu'aucune sortie n'est imprimée sur le terminal.Par défaut:
Dans le script, vous utilisez
> /dev/null
causant:Et puis
2>&1
causant:la source
> /dev/null 2>&1
, cette commande a pour résultatstderr ==> stdout
que stderr est toujours imprimé sur stdout?fd
?CMD > /dev/null 2>&1
maisCMD 2>&1 > /dev/null
me donne-t- il encore STDERR?2>& 1
dans les exemples de code, pour souligner que le nombre et l'esperluette sont considérés comme faisant partie de l'opérateur de redirection. Il est courant que la redirection vers un fichier ait un espace entre>
et/path/to/file
, la redirection vers un descripteur de fichier est essentiellement la même chose.(Notez que j'ai déjà ajouté la redirection
/dev/null
dans votre question.)Ce qui précède redirige le
STDOUT
etSTDERR
vers/dev/null
. Cela fonctionne en fusionnantSTDERR
leSTDOUT
. (Essentiellement, toute la sortie de la commande serait redirigée vers le périphérique null .)Ce n'est pas vraiment comme un
try/catch
ou quoi que ce soit. Il supprime simplement tout type de sortie (y compris d'erreur) de la commande.Cela pourrait entraîner des erreurs pour un certain nombre de raisons, notamment:
la source
Lorsque vous exécutez CMD> / dev / null 2> & 1
STDOUT redirige vers / dev / null, puis STDERR redirige vers THE ADDRESS de STDOUT, qui a été défini sur / dev / null; par conséquent, STDOUT et STDERR pointent vers / dev / null.
Inversement, lorsque vous exécutez CMD 2> & 1> / dev / null
STDERR redirige vers L'ADRESSE de STDOUT (le descripteur de fichier 1 à cet instant, ou / proc / self / fd / 1), puis STDOUT redirige vers / dev / null, mais STDERR continue de rediriger vers fd1 !! En conséquence, la sortie normale de STDOUT est supprimée, mais les erreurs provenant de STDERR sont toujours écrites sur la console.
la source
Redirection Bash I / O
L'idée principale pour clarifier les choses est la suivante:
Donc ce code:
redirige
stderr
versstdout
first (2>&1
) puis envoiestdout
(incluant le redirigéstderr
) tofilename
(> filename
). Voici l'explication de l'ABSG (Ch. 20) .Ce code:
redirections
stderr
etstdout
vers/dev/null
... ce qui signifie nulle part . Les éléments envoyés à/dev/null
ne sont en aucun cas sauvegardés, mis en cache ou mémorisés.Ils sont simplement envoyés dans « nulle part » et oubliés. C'est une façon d'exécuter des programmes et de s'assurer qu'ils ne produisent AUCUNE sortie et qu'ils ne seront jamais vus sur la ligne de commande ou dans un fichier journal.
Je vois ce type de question un peu ... principalement parce que je dois le chercher moi-même depuis que je ne code pas depuis des années. Voici quelques informations utiles de l'ABSG:
"La redirection signifie simplement capturer la sortie d'un fichier, d'une commande, d'un programme ou d'un script et l'envoyer en tant qu'entrée dans un autre fichier, commande, programme ou script."
ABSG: Guide de script avancé Bash: Le lien du chapitre 20 ci - dessus est un lien vers la page de redirection des E / S du document open source tldp.org appelé Guide de script avancé de Bash par Mendel Cooper. Il est répertorié comme "une exploration en profondeur de l'art de l'écriture de scripts shell" et je suis absolument d'accord. C'est une ressource formidable qui offre une multitude de réponses à toutes sortes de situations délirantes.
Autres ressources précieuses: Il existe de nombreuses ressources précieuses dans la section en cours / mise à jour (dans plusieurs formats pratiques tels que html, pdf, texte, etc.) sur la page Guides de projet de documentation Linux . Voici quelques exemples que j'ai trouvés utiles:
la source
filename
, puis l'erreur standard est redirigée là où la sortie standard est actuellement (versfilename
). Si c'était le contraire, l'erreur standard se retrouverait sur le terminal alors que seule la sortie standard serait redirigéefilename
. En outre, danscommand >file1 2>file2
,file2
ne serait pas créé s'ilfile1
ne pouvait pas être créé (peu importe sifile1
etfile2
étaient en fait des noms de chemins totalement différents).