Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

logger le stderr et stdout un script dans le syslog

18 réponses
Avatar
Francois Lafont
Bonsoir à tous,

Avec la commande shell « echo message | logger -t tag », je peux mettre
dans un script un message dans le syslog de ma Debian. Mais est-il possible
de faire en sorte de mettre dans le syslog _tout_ ce que pourra afficher mon
script via stderr et stdout plutôt que d'utiliser la commande logger au coup
par coup ?

Par ailleurs, mon script utilise /bin/sh et donc j'aimerais éviter les basheries
si possible. Est-ce possible de faire ça ?

J'ignore comment (d'où ma question ici) mais ne puis-je pas lancer en arrière
plan la commande logger au tout début de mon script puis ensuite faire en sorte
que le script balance stdout et stderr dans le flux d'entrée du process logger ?

--
François Lafont

8 réponses

1 2
Avatar
Benoit Izac
Bonjour,
Le 28/07/2016 à 18:23, Nicolas George a écrit dans le message
<579a318e$0$19760$ :
Je n'ai pas ce comportement.

Étrange. Quel protocole as-tu utilisé exactement pour tester ?

% cat t.sh
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
} | tr '[a-z]' '[A-Z]'
% sh t.sh; echo $?
A
1
tr est bien exécuté mais la dernière commande ici est « false » qui
provoque l'interruption immédiate du script. C'est conforme à la
description du set -e dans SUSv4 :
-e
When this option is on, if a simple command fails for any of the
reasons listed in Consequences of Shell Errors or returns an exit
status value >0, and is not part of the compound list following
a while, until, or if keyword, and is not a part of an AND or OR
list, and is not a pipeline preceded by the ! reserved word, then
the shell shall immediately exit.
--
Benoit Izac
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
tr est bien exécuté mais la dernière commande ici est « false » qui
provoque l'interruption immédiate du script.

Et le code de retour est bien 1. Ton message confirme mes explications.
Pourquoi disais-tu le contraire ?
Avatar
Francois Lafont
Bonsoir,
On 28/07/2016 18:41, Nicolas George wrote:
Et le code de retour est bien 1. Ton message confirme mes explications.
Pourquoi disais-tu le contraire ?

Et bien là je ne comprends pas ta remarque Nicolas et j'ajoute que je ne pige
pas non plus l'exemple de Benoît car je n'ai pas la même chose que lui (voir
ci-dessous).
Concernant ta remarque ci-dessus, tu disais que « le code de retour
d'un pipeline est le code de retour de sa dernière commande » ce qui me
semble exact. Mais Benoît, lui, il obtient 1 comme valeur de retour dans
son exemple ce qui voudrait donc dire que sa commande "tr" retourne 1.
Ce serait curieux, non ?
C'est d'autant plus curieux que, si je reprends l'exemple de Benoît, perso je
n'ai pas la même chose que lui :
~$ cat /tmp/test.sh
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
} | tr '[a-z]' '[A-Z]'
~$ /tmp/test.sh ; echo $?
A
0
Moi j'ai 0 comme valeur de retour ce qui me semble plus en cohérence avec
l'idée que « le code de retour d'un pipeline est le code de retour de sa
dernière commande ».
Bref, je ne comprends pas :
1. comment Benoît peut avoir 1 comme valeur de retour avec son pipe,
2. ni ta remarque disant que l'exemple de Benoît va dans ton sens alors
que pour moi ce n'est pas le cas (en revanche ce que je constate moi sur
ma Wheezy va dans ton sens).
Bref, je suis perdu là. ;)
NB: Je suis sous Debian Wheezy et /bin/sh correspond chez moi à /bin/dash
version 0.5.7-3.
--
François Lafont
Avatar
Benoit Izac
Bonjour,
Le 28/07/2016 à 19:48, Francois Lafont a écrit dans le message
<579a455f$0$26260$ :
Bref, je ne comprends pas :
1. comment Benoît peut avoir 1 comme valeur de retour avec son pipe,

Parce qu'il n'a pas exécuté exactement qu'il a donné en exemple...
2. ni ta remarque disant que l'exemple de Benoît va dans ton sens alors
que pour moi ce n'est pas le cas (en revanche ce que je constate moi sur
ma Wheezy va dans ton sens).

Oui, c'est confus, reprenons. Comme l'indiquait Nicolas, le code de
retour est bien 0 lorsque l'on pipe dans cat (c'est ce que tu
constates). Dans mon test, j'avais ajouté quelques trucs après le
« {...} | cat » pour voir si ça continuais mais en fait ça tombait sur
un « false » derrière d'où le retour 1.
Donc effectivement, lorsque l'on pipe, le code de retour est celui de la
dernière commande.
Bref, faire un test vite fait à cinq heures du mat avant de partir au
boulot est une mauvaise idée. Refaire le même test après un journée de
boulot où tu es parti tôt est tout autant inutile. Désolé pour le bruit,
je vais me reposer.
--
Benoit Izac
Avatar
Francois Lafont
Bonsoir,
On 28/07/2016 21:20, Benoit Izac wrote:
1. comment Benoît peut avoir 1 comme valeur de retour avec son pipe,

Parce qu'il n'a pas exécuté exactement qu'il a donné en exemple...

Ah ok.
2. ni ta remarque disant que l'exemple de Benoît va dans ton sens alors
que pour moi ce n'est pas le cas (en revanche ce que je constate moi sur
ma Wheezy va dans ton sens).

Oui, c'est confus, reprenons. Comme l'indiquait Nicolas, le code de
retour est bien 0 lorsque l'on pipe dans cat (c'est ce que tu
constates). Dans mon test, j'avais ajouté quelques trucs après le
« {...} | cat » pour voir si ça continuais mais en fait ça tombait sur
un « false » derrière d'où le retour 1.

Ok.
Donc effectivement, lorsque l'on pipe, le code de retour est celui de la
dernière commande.
Bref, faire un test vite fait à cinq heures du mat avant de partir au
boulot est une mauvaise idée. Refaire le même test après un journée de
boulot où tu es parti tôt est tout autant inutile. Désolé pour le bruit,
je vais me reposer.

Pas de souci, ça arrive et ça n'enlève rien à la qualité globale de tes
interventions sur ce forum de news.
Maintenant tout est clair... ou presque. ;)
Je constate un truc un peu curieux du coup :
~$ cat /tmp/test.sh
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
} | tr '[a-z]' '[A-Z]'
echo fin
~$ /tmp/test.sh; echo $?
A
fin
Perso, je trouve ça curieux car :
- d'un côté j'ai le « set -e » qui dit « dès qu'une commande retourne x != 0,
on arrête le script » et _d'une_ _certaine_ _manière_ c'est ce qui se produit
avec le « false » qui fait que le « echo 'b' » n'est jamais exécuté.
- mais d'un autre côté, le « set -e » ne fait pas son boulot complètement car
le script ne s'arrête pas définitivement vu que le "echo fin" est exécuté
(du fait que la commande pipe « { ... } | tr ... » possède comme valeur de
retour celle de tr.
Du coup, c'est bizarre dans cette exemple on a un « set -e » qui fait qu'une
partie du job, non ?
Ou alors je dois voir le { ... } comme un sous-shell mais ce n'est pourtant
pas le cas sauf erreur.
--
François Lafont
Avatar
Lucas Levrel
Le 28 juillet 2016, Francois Lafont a écrit :
Maintenant tout est clair... ou presque. ;)
Je constate un truc un peu curieux du coup :
~$ cat /tmp/test.sh
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
} | tr '[a-z]' '[A-Z]'
echo fin
~$ /tmp/test.sh; echo $?
A
fin

Je n'ai pas le temps de faire l'exemple minimal demandé par Benoît, mais
je dois être dans une situation similaire car la commande qui foire est
dans un for à l'intérieur de la liste { }. Je suppose donc que le foirage
a interrompu l'itération en cours mais que le for a continué son œuvre...
Perso, je trouve ça curieux car :
- d'un côté j'ai le « set -e » qui dit « dès qu'une commande retourne x != 0,
on arrête le script » et _d'une_ _certaine_ _manière_ c'est ce qui se produit
avec le « false » qui fait que le « echo 'b' » n'est jamais exécuté.
- mais d'un autre côté, le « set -e » ne fait pas son boulot complètement car
le script ne s'arrête pas définitivement vu que le "echo fin" est exécuté
(du fait que la commande pipe « { ... } | tr ... » possède comme valeur de
retour celle de tr.
Du coup, c'est bizarre dans cette exemple on a un « set -e » qui fait qu'une
partie du job, non ?
Ou alors je dois voir le { ... } comme un sous-shell mais ce n'est pourtant
pas le cas sauf erreur.

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
C'est mieux avé les accents (F. Patte)
Avatar
Nicolas George
Francois Lafont , dans le message
<579a6304$0$3331$, a écrit :
~$ cat /tmp/test.sh
#!/bin/sh
set -e
{
echo 'a'
false
echo 'b'
} | tr '[a-z]' '[A-Z]'
echo fin
~$ /tmp/test.sh; echo $?
A
fin
Perso, je trouve ça curieux car :
- mais d'un autre côté, le « set -e » ne fait pas son boulot complètement car
le script ne s'arrête pas définitivement vu que le "echo fin" est exécuté
(du fait que la commande pipe « { ... } | tr ... » possède comme valeur de
retour celle de tr.

Du point de vue du script, tout le premier bloc est une seule commande, de
l'accolade à la fin de tr.
- d'un côté j'ai le « set -e » qui dit « dès qu'une commande retourne x != 0,
on arrête le script » et _d'une_ _certaine_ _manière_ c'est ce qui se produit
avec le « false » qui fait que le « echo 'b' » n'est jamais exécuté.

Mais le set -e est toujours en effet dans le bloc entre accolades, qui
constitue un sous-script dont l'exécution est interrumpue.
Ou alors je dois voir le { ... } comme un sous-shell mais ce n'est pourtant
pas le cas sauf erreur.

La sémantique des accolades est bien de ne pas lancer de sous-shell. Mais
chaque membre d'un pipeline est dans un sous-shell. Ça ne pourrait pas
marcher sinon. Donc les accolades ne lancent pas un sous-sous-shell, mais
sont bien déjà exécutées dans un sous-shell.
(Remarque : avec zsh, le dernier élément du pipeline est lancé dans le shell
actuel si possible. Ça permet des constructions du genre
« command | read x » qui ne marcheraient pas sinon.
Avatar
Francois Lafont
Bonjour,
On 29/07/2016 00:40, Nicolas George wrote:
La sémantique des accolades est bien de ne pas lancer de sous-shell. Mais
chaque membre d'un pipeline est dans un sous-shell. Ça ne pourrait pas
marcher sinon. Donc les accolades ne lancent pas un sous-sous-shell, mais
sont bien déjà exécutées dans un sous-shell.

Ok, merci beaucoup. C'était ça qui me manquait. La partie { ... } est exécutée
dans un sous shell _à_ _cause_ de la présence du pipe et ce sous shell est bien
interrompu à cause du "set -e". Mais au niveau du script courant, la commande
« { ... } | tr .... », elle, renvoie bien 0 et le script courant peut continuer.
Tout se tient.
Merci encore Nicolas pour toutes ces explications très claires.
--
François Lafont
1 2