La première chose à noter est qu’il ya plusieurs manières selon votre objectif et votre environnement. Par conséquent, cela nécessite une compréhension limitée de plusieurs aspects. Le plus typique est via 2>
dans les shells de type Bourne , tels que dash
(qui est lié à /bin/sh
) et bash
; Le premier est le shell par défaut et le shell compatible POSIX et l’autre est ce que la plupart des utilisateurs utilisent pour une session interactive. Ils diffèrent par la syntaxe et les fonctionnalités, mais heureusement pour nous, la redirection du flux d’erreur fonctionne de la même manière (sauf le &>
non standard). Dans le cas de csh et de ses dérivés, la redirection stderr ne fonctionne pas tout à fait ici.
Revenons à la partie 2>
. Deux choses importantes à noter: >
signifie opérateur de redirection, où nous ouvrons un fichier et 2
integer représente le descripteur de fichier stderr; En fait, c'est exactement la norme POSIX pour le langage shell qui définit la redirection dans section 2.7 :
[n]redir-op word
Pour une redirection simple de >
, le nombre entier 1
est implicite pour stdout
, c'est-à-dire que echo Hello World > /dev/null
est identique à echo Hello World 1>/dev/null
. Notez que l'opérateur de type entier ou redirection ne peut pas être cité, sinon shell ne les reconnaît pas en tant que tel et traite plutôt de chaîne littérale de texte. En ce qui concerne l'espacement, il est important que l'entier soit juste à côté de l'opérateur de redirection, mais le fichier peut être soit à côté de l'opérateur de redirection, soit command 2>/dev/null
et command 2> /dev/null
fonctionnera correctement.
La syntaxe quelque peu simplifiée pour une commande typique en shell serait
command [arg1] [arg2] 2> /dev/null
L'astuce ici est que la redirection peut apparaître n'importe où. C'est-à-dire que 2> command [arg1]
et command 2> [arg1]
sont valides. Notez que pour bash
shell, il existe une méthode &>
pour rediriger les flux stdout et stderr en même temps, mais encore une fois, c'est spécifique à bash et si vous essayez de porter des scripts, cela risque de ne pas fonctionner. Voir aussi Wiki Ubuntu et Quelle est la différence entre & amp; & gt; et 2 & gt; & amp; 1 .
Remarque: L'opérateur de redirection >
tronque un fichier et le remplace, si le fichier existe. Le 2>>
peut être utilisé pour ajouter stderr
au fichier.
Si vous remarquez que >
est destiné à une seule commande. Pour les scripts, nous pouvons rediriger le flux stderr de tout le script depuis l'extérieur comme dans myscript.sh 2> /dev/null
ou utiliser exec . L'exécutable intégré a le pouvoir de recâbler le flux pour toute la session shell, pour ainsi dire, de manière interactive ou via un script. Quelque chose comme
#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file
Dans cet exemple, le fichier journal devrait afficher stat: cannot stat '/etc/non_existing_file': No such file or directory
.
Encore une autre manière est via les fonctions. Dans sa réponse, kopciuszek , nous pouvons écrire une déclaration de fonction avec une redirection déjà attachée, à savoir
some_function(){
command1
command2
} 2> my_log_file.txt