Avant d’expliquer de façon simple ce que représente /dev/null, il faut faire juste un petit rappel simple.
Chaque processus a 3 flux:
- un flux d’entré: STDIN(0)
- un flux de sortie standard: STDOUT(1)
- un flux de sortie d’erreur: STDERR(2)
c’est quoi > ou <
Le symbole > ou < permet la redirection d’une entité.
exemple:
cat toto > tata
Explication simpliste:
la commande cat redirige toto dans tata.
Si, on souhaite rediriger titi à la suite de toto dans tata sans écraser toto:
cat titi >> tata
Ou rediriger titi dans tata en écrasant toto:
cat titi > tata
Dans l’exemple: toto,titi et tata sont de simples fichiers.
Un exemple avec < :
mysql -u root -p MaBDD < MaBDDsauv.sql
Ici MaBDDsauv.sql est redirigé dans MaBDD, ce qui permet de restaurer la base de donnée MaBDD.
c’est quoi >/dev/null?
/dev/null représente le rien.
Ce rien peut être comparé à un trou noir dans l’espace.
Ce qui à pour conséquence, que chaque flux envoyé dans ce trou noir ne pourra jamais être récupéré.
exemple de commande avec >/dev/null dans un crontab:
***4* /home/fred/script/test.sh >/dev/null
Chaques taches planifiées dans un crontab envoient un mail à l’administrateur du système(ou root), pour éviter l’envoie systématique on redirige tout le flux STDOUT dans /dev/null.
A savoir, que lorsque /dev/null est utilisé sans précision, seule la sortie du flux STDOUT est concernée.
Donc, si une erreur se produit l’administrateur sera prévenue grâce à la sortie STDERR.
c’est quoi < /dev/null?
Dans un script, il se peut qu’une commande est besoin d’une intervention humaine pour répondre à une question généralement yes ou no(y/n).
- Forcer la réponse à yes
Ajouter l’option -f, exemple:
cp -f ficher1 directory/
La copie du fichier1 dans le répertoire directory est forcée.
- Forcer la réponse à no
< /dev/null sera utilisé, exemple:
cp ficher1 /directory </dev/null
Si le fichier1 existe déjà dans le répertoire, avec l’option < /dev/null, le script n’écrasera pas le fichier1 déjà présent dans directory.
c’est quoi /dev/null 2>&1
2>&1 redirige la sortie d’erreur(STDERR) vers la sortie standard(STDOUT) et la sortie STDOUT dans /dev/null.
exemple en reprenant celui de la tache cron:
*4*** /home/fred/script/test.sh >/dev/null 2>&1
Dans ce cas, l’administrateur ou root ne sera jamais si la commande c’est bien exécutées ou pas.
Sauf, si le test est prévue dans le scripte test.sh.
Jute un simple merci pour ce billet.
Surtout la partie /dev/null 2>&1 qui n’est pas toujours bien expliqué (voire pas du tout dans tout les tutos crontab)
Merci encore :)
en gros /dev/null c’est comme une corbeil?
et ouai merci pour les explications de STDIN STDOUT et STDERR
Merci à toi pour ton commentaire :-)
oui /dev/null c’est comme une poubelle en quelque sorte.
Je connaissais, mais j’avais besoin de connaître un point précis lors d’une utilisation en conjonction avec tee
J’utilise par exemple la commande suivante:
harbour toto.prg 2>&1 |tee -a test.log
J’ai remarqué que les erreurs ne suivent pas dans test.log.
Est-ce normal ?
Faudrait-il utiliser:
harbour toto.prg 2>>test.log |tee -a test.log
ou
harbour toto.prg 1>> test.log 2>>test.log
Merci pour tous ces articles passionnants et très didactiques.
Merci beaucoup pour tes explications
svp j’ai besoins de plus d’éclaircissement svp
/dev/null c’est le néant, tu peux même l’envoyer dans un fichier rempli de texte pour le vider de son contenu, ex. :
dev/null > /tmp/users.txt
Dans ce cas, l’administrateur ou root ne saura jamais si la commande c’est bien exécutées ou pas.