47 votes

pourquoi c'est 2>&1 et non 2>>&1 qu'il faut ajouter à un fichier journal

Je redirige STDOUT et STDERR vers un seul fichier, toujours en croissance, donc j'utilise toujours la redirection "append" ; c'est >>

mon commandement est command >> logfile 2>&1

Et cela fonctionne.

Mais la redirection STDERR ne comporte qu'un seul élément > que j'utilisais pour "créer" le fichier, en effaçant le précédent, comme dans le cas suivant command > outlog 2> errlog

Pourquoi n'efface-t-il pas le fichier journal dans ce cas ?

58voto

James Mertz Points 390

Lorsque vous redirigez quelque chose vers &_number_ vous n'ouvrez pas du tout un nouveau fichier ; vous êtes en train de réutilisation d'un fichier déjà ouvert ainsi que le mode dans lequel il a été ouvert.

Les numéros se réfèrent à des handles (descripteurs de fichiers) de type "open file" (fichier ouvert). Il n'y a donc pas de différence technique entre la façon dont les >& y >>& (et en effet <& ) fonctionnerait - ils signifient tous simplement "cloner le descripteur de fichier existant en utilisant dup()".

C'est-à-dire, 2>&1 indique que le descripteur de fichier n° 1 (que vous avez ouvert précédemment) pour l'ajout en utilisant >>logfile ) est cloné dans le numéro 2. Et oui, 2<&1 fonctionne de manière identique.

Note technique secondaire : l'addition ou la troncature n'est pas une action explicite effectuée par le Shell ; il s'agit en fait d'un mode que le Shell spécifie. à l'ouverture le fichier, et le reste est effectué par le système d'exploitation lui-même. Par exemple, lorsque vous utilisez > le Shell n'est pas manuellement efface l'ancien contenu, il ajoute simplement O_TRUNC lors de l'appel à open(). Par conséquent, lorsque open() n'est pas appelé à tous le mode précédent reste inchangé.

14voto

Eugen Rieck Points 19064

La séquence command >> logfile 2>&1 comporte deux étapes de redirection :

  • command >> logfile sera ajouté au fichier journal
  • 2>&1 redirigera stderr vers stdout (qui lui-même ajoute dans le fichier journal)

Donc command >> logfile 2>&1 ne tronquera pas le fichier journal, tandis que command >>logfile 2>logfile serait.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X