OVH Cloud OVH Cloud

redirection sortie d'erreur et creation de fichier

4 réponses
Avatar
Benoit Izac
Bonjour,

Je suppose que la question a déjà été abordée mais je ne suis pas arrivé
à retrouver quelque chose :

Je lance une commande avec cron :
command 2> /root/command.err

Le problème est que même s'il n'y a pas d'erreur, le fichier
/root/command.err est créé (vide).

Comment éviter ce comportement ?

Merci.
--
Benoit Izac

4 réponses

Avatar
Benoit Izac
Bonjour,

le 11/07/2003 à 12:00, Stephane CHAZELAS a écrit
dans le message :

Je lance une commande avec cron :
command 2> /root/command.err

Le problème est que même s'il n'y a pas d'erreur, le fichier
/root/command.err est créé (vide).

Comment éviter ce comportement ?


Supprimer le fichier s'il est vide, ou récupérer l'output dans
une variable, et écrire son contenu dans un fichier que si elle
n'est pas vide:

exec 3>&1
var=`command 2>&1 >&3 3>&-; echo .`
exec 3>&-
[ . = "$var" ] || sed '$d' > /root/command.err << EOF
$var
EOF

Mais c'est pas très joli, et il ne faut pas que command affiche
des '' sur sa sortie d'erreur.


Merci.

Avec un autre shell (au hasard zsh), est-il possible de faire plus
simple ?

--
Benoit Izac


Avatar
Stephane CHAZELAS
Le Fri, 11 Jul 2003 12:38:02 +0200, Benoit Izac écrivait :
[...]
Je lance une commande avec cron :
command 2> /root/command.err

Le problème est que même s'il n'y a pas d'erreur, le fichier
/root/command.err est créé (vide).

Comment éviter ce comportement ?
[...]



Avec un autre shell (au hasard zsh), est-il possible de faire plus
simple ?



En zsh, tu peux éventuellement faire un truc genre:

{
command 2>&1 >&3 3>&- | {
read -rku0 && {
print -rn -- $REPLY
cat
} > /root/command.err
}
} 3>&1

Ça évite de mettre tout l'output en mémoire, et ça devrait etre
OK avec les ''.

en fait, tu peux aussi faire avec n'importe quel shell:

{
command 2>&1 >&3 3>&- | awk '{print > "/root/command.err"}'
} 3>&1

Avec un awk GNU, il ne devrait pas y avoir de limitation

--
Stéphane



Avatar
Stephane CHAZELAS
Le 11 Jul 2003 11:30:51 GMT, Stephane CHAZELAS écrivait :
[...]
{
command 2>&1 >&3 3>&- | awk '{print > "/root/command.err"}'
} 3>&1

Avec un awk GNU, il ne devrait pas y avoir de limitation


Sauf que ça rajoute un saut de ligne à la fin s'il n'y en avait
pas.

--
Stéphane

Avatar
Benoit Izac
Bonjour,

le 11/07/2003 à 13:48, Stephane CHAZELAS a écrit dans le message
:

{
command 2>&1 >&3 3>&- | awk '{print > "/root/command.err"}'
} 3>&1

Avec un awk GNU, il ne devrait pas y avoir de limitation


Sauf que ça rajoute un saut de ligne à la fin s'il n'y en avait
pas.


Pas de problème ; c'est nickel.

--
Benoit Izac