Comment rediriger stderr vers un fichier

149

Lorsque vous utilisez nohup pour exécuter une commande en arrière-plan, une partie du contenu apparaît dans le terminal.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Je veux enregistrer ce contenu dans un fichier.

    
posée André M. Faria 18.05.2015 - 14:31
la source

2 réponses

242

Il existe deux principaux flux de sortie sous Linux (et autres systèmes d'exploitation), la sortie standard (stdout) et l'erreur standard (stderr). Les messages d'erreur, tels que ceux que vous affichez, sont imprimés en erreur standard. L'opérateur de redirection classique ( command > file ) ne redirige que la sortie standard. L'erreur standard est donc toujours affichée sur le terminal. Pour rediriger également stderr, vous avez quelques choix:

  1. Rediriger stdout vers un fichier et stderr vers un autre fichier:

    command > out 2>error
    
  2. Redirection de stderr vers stdout ( &1 ), puis redirige stdout vers un fichier:

    command >out 2>&1
    
  3. Rediriger les deux dans un fichier:

    command &> out
    

Pour plus d’informations sur les différents opérateurs de contrôle et de redirection, voir ici .

    
réponse donnée terdon 18.05.2015 - 14:50
la source
4

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
    
réponse donnée Sergiy Kolodyazhnyy 03.05.2018 - 09:48
la source

Lire d'autres questions sur les étiquettes