Question Comment rediriger stderr vers un fichier [dupliquer]


Cette question a déjà une réponse ici:

En utilisant nohup pour mettre une commande à exécuter 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.


161
2018-05-18 12:31


origine




Réponses:


Il existe deux principaux flux de sortie sous Linux (et les 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, donc l'erreur standard est 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 vers un fichier:

    command &> out
    

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


262
2018-05-18 12:50



Alors hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & ou hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 ou hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria oui. Mais les deux dernières commandes sont équivalentes, elles enverront à la fois une erreur et une sortie dans le même fichier. - terdon♦
Comme dans le lien que vous avez fourni, je pourrais utiliser | & au lieu de 2> & 1, ils sont équivalents, merci pour votre temps. - André M. Faria
Bonjour, j'ai pu simplifier ceci pour: command 2> out. - Surya Teja Karra
@SuryaTejaKarra qui ne redirige que stderr, mais pas stdout. - terdon♦


La première chose à noter est qu'il y a 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 Coquilles de type Bourne, tel 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 dans 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 ses dérivés, la redirection stderr ne travaille pas vraiment là.

Revenons à 2> partie. Deux choses importantes à noter: > signifie opérateur de redirection, où nous ouvrons un fichier et 2 entier signifie stderr fichier descriptor; 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 simple > redirection, le 1 entier est impliqué pour stdout, c'est à dire. echo Hello World > /dev/null est la même chose que 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 non. command 2>/dev/null et command 2> /dev/null va bien fonctionner.

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 à la fois 2> command [arg1] et command 2> [arg1] sont valides. Notez que pour bash shell, il existe là &> façon de rediriger les flux stdout et stderr en même temps, mais encore une fois - c'est spécifique à bash et si vous vous efforcez de la portabilité des scripts, cela risque de ne pas fonctionner. Voir également Ubuntu Wiki et Quelle est la différence entre &> et 2> & 1.

Remarque: le > opérateur de redirection tronqueun fichier et le remplace, si le fichier existe. le 2>> peut être utilisé pour ajouter stderr déposer.

Si vous le remarquez, > 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 nous pouvons faire usage de exec intégré. 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 doit afficher stat: cannot stat '/etc/non_existing_file': No such file or directory.

Encore une autre façon est via les fonctions. Comme kopciuszek noté dans sa réponse, nous pouvons écrire la déclaration de fonction avec la redirection déjà attachée, c'est-à-dire

some_function(){
    command1
    command2
} 2> my_log_file.txt

4
2018-05-03 07:48