En ce qui concerne une solution pour rediriger beaucoup de commandes à la fois:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Pourquoi votre solution d'origine ne fonctionne-t-elle pas: exec 2> & 1 redirige la sortie d'erreur standard vers la sortie standard de votre shell, qui, si vous exécutez votre script à partir de la console, sera votre console. la redirection de canal sur les commandes ne fera que rediriger la sortie standart de la commande.
Du point de vue de somecommand
, sa sortie standard va dans un tuyau connecté à tee
et l'erreur standard va dans le même fichier / pseudofile que l'erreur standard du shell, que vous redirigez vers la sortie standard du shell, qui sera le console si vous exécutez votre programme à partir de la console.
La seule vraie façon de l'expliquer est de voir ce qui se passe réellement:
L'environnement d'origine de votre shell peut ressembler à ceci si vous l'exécutez à partir du terminal:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Après avoir redirigé l'erreur standard vers la sortie standard ( exec 2>&1
), vous ne changez rien en gros. Mais si vous redirigez la sortie standard du script vers un fichier, vous obtiendrez un environnement comme celui-ci:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Ensuite, rediriger l'erreur standard du shell dans la sortie standard se terminerait ainsi:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
L'exécution d'une commande héritera de cet environnement. Si vous exécutez une commande et que vous la dirigez vers tee, l'environnement de la commande serait le suivant:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Donc l'erreur standard de votre commande va toujours dans ce que le shell utilise comme erreur standard.
Vous pouvez réellement voir l’environnement d’une commande en regardant dans /proc/[pid]/fd
: utiliser ls -l
pour lister également le contenu du lien symbolique. Le 0
fichier ici est une entrée standard, 1
une sortie standard et 2
une erreur standard. Si la commande ouvre plus de fichiers (et la plupart des programmes le font), vous les verrez également. Un programme peut également choisir de rediriger ou de fermer ses entrées / sorties standard et de les réutiliser 0
, 1
et 2
.
|&
fonctionne comme un raccourci2>&1 |
, c’est au moins un peu plus pratique.