J'ai stocké le programme suivant dans new.c
int main()
{
a;
return 0;
}
Il renvoie un message d'erreur. Je veux envoyer ce message dans un fichier. J'ai donc utilisé la commande suivante
gcc new.c > temp.txt
Mais je recevais toujours la sortie sur le terminal. J'utilise Ubuntu 13.04. Comment puis-je le faire fonctionner?
Réponses:
Lorsque vous compilez un programme avec
gcc
, il existe différents types de sortie: versstdout
etstderr
. Normalement, le flux>
sera dirigéstdout
vers un fichier (par exemple, le résultat d'unprintf("hello world\n");
est envoyé àstdout
). Cependant, lestderr
continue d'être envoyé à l'écran, car il est supposé être "quelque chose d'exceptionnel dont vous devez être informé".Il existe un moyen de rediriger stderr vers un fichier - vous le faites avec la commande suivante (pas très intuitive):
où
&>
est "raccourci bash" pour "tout rediriger". Comme l'a souligné @CharlesDuffy, le formulaire conforme POSIX estCela signifie "compiler 'new.c' et envoyer
stdout
àmyFile
. Et envoyerstderr
(2) au même endroit questdout
(&1
=" au même endroit que stdout ").Vous trouverez plus de détails sur les différentes redirections sur http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html et http://mywiki.wooledge.org/BashFAQ/055
Soit dit en passant, si vous souhaitez envoyer quelque chose depuis votre programme spécifiquement vers
stderr
, vous pouvez le faire avec les éléments suivantsSi vous incluez cela dans un programme, exécutez le programme et envoyez la sortie "normale" à un fichier, cela apparaîtra toujours sur la console. Donc, si vous compilez ce qui précède dans l'exécutable
urgent
, tapezà la console, votre sortie apparaîtra à l'écran.
la source
>myFile 2>&1
) ainsi que l'extension bash (&>
).Étant donné que les
>
redirections ne concernent que la sortie standard et que les erreurs sont écritesstderr
, vous devez utiliser l'une des options suivantes à la place:...ou...
&>
est une extension BASH qui redirige à la foisstdout
etstderr
vers un fichier; autrement, la meilleure approche est d'abord stdout redirect (>temp.txt
), puis faire stderr (FD 2) une copie du descripteur de fichier déjà redirigé sur la sortie standard (FD 1), comme suit:2>&1
.la source
Comme les autres l'ont dit, Linux fournit deux flux de sortie différents:
stdout , ou "sortie standard", est l'endroit où toutes les sorties normales vont.
Vous pouvez le référencer en utilisant un descripteur de fichier
1
.stderr , ou "erreur standard" est un flux distinct pour les informations hors bande.
Vous pouvez le référencer en utilisant un descripteur de fichier
2
.Pourquoi deux flux de sortie différents? Considérons un pipeline de commandes imaginaires:
Imaginez maintenant que la
decrypt
commande échoue et génère un message d'erreur. S'il envoyait ce message àstdout
, il serait envoyé dans le tuyau, et à moins qu'il n'ait le mot «secret», vous ne le verriez jamais. Vous vous retrouveriez donc avec un fichier de sortie vide, sans aucune idée de ce qui n'allait pas.Cependant, puisque le canal capture uniquement
stdout
, ladecrypt
commande peut envoyer ses erreurs à l'stderr
endroit où elles seront affichées sur la console.Vous pouvez rediriger
stdout
etstderr
, ensemble ou indépendamment:Vous pouvez rediriger les erreurs
stdout
et les traiter comme s'il s'agissait d'une sortie normale:Vous pouvez également utiliser une notation "abrégée" pour rediriger à la fois stdout et stderr vers le même fichier:
Enfin, l'
>
opérateur tronquera d' abord son fichier de sortie avant d'y écrire. Si, à la place, vous souhaitez ajouter des données à un fichier existant, utilisez l'>>
opérateur:la source
$FOO
) est une source courante de bogues, et la démontrer dans les exemples n'est pas si génial. (2) L'utilisation de noms de variables tout en majuscules est la principale raison des conflits d'espace de noms entre l'environnement et les variables intégrées (majuscules par convention) et les variables locales (minuscules par convention). (3) Encourager les gens à utiliser à plusieurs reprises>>
(qui rouvre le fichier chaque fois qu'il est utilisé dans une commande) plutôt que d'ouvrir un fichier une fois et de laisser le descripteur de fichier ouvert pour une utilisation par plusieurs commandes entraîne un code inefficace.exec 4>secrets; echo "this is a secret" >&4; echo "this is another secret" >&4
exec
pour des raisons de simplicité, bien que dans la pratique, ce soit généralement une meilleure stratégie.command₁
>
output_file
;
command₂
>>
the_same_output_file
(
command₁
;
command₂
) >
output_file
{
command₁
;
command₂
; } >
output_file
{
;
}