Le fichier temporaire créé via mktemp sert à stocker (temporairement) la sortie de la commande, pour laquelle aucun traitement immédiat n'est nécessaire.
Ainsi, après avoir "redirigé" les écritures sur 2(stderr) vers là où est écrit la sortie 1(stdout), tu peux faire de même en envoyant 1(stdout) vers le fichier temporaire.
L'important est de conserver l'ordre des redirections sinon ca ne fait pas ce que l'on souhaite :-)
Une fois que la commande est terminée et que write_log a fini, tu peux lire le contenu du fichier temporaire pour le charger dans une variable (dans ton exemple initial, il s'agissait de TAR).
En espérant avoir pu éclaircir les dernières ambigüités de mon premier commentaire ^__^
Bon courage !
Cdlt,
PS: Pour donner une solution à ton problème, voici le code que je propose et qui utilise un "wrapper" (A TESTER !).
Par avance, je vous remercie pour votre indulgence:
# Les constantes
# HOSTNAME - Nom de la machine
declare -r HOSTNAME="${HOSTNAME:-$(hostname)}"
function execute_et_log_stderr {
# Argument 1: Le fichier de log ou /dev/null :-)
local -r log_stderr="${1:-/dev/null}"
shift
# Une ressource temporaire pour stdout
local -r cmd_stdout=$(mktemp -q)
if [ ${?} -ne 0 ]; then
echo Impossible d"'"allouer une ressource temporaire '!'
return 255
fi
${@} 2>&1 1>"${cmd_stdout}" \
| while read cmd_stderr; do
echo "$(date +%b" "%d" "%T) ${HOSTNAME} backupeur[$$]: ligne :${cmd_stderr}"
done >> ${log_stderr}
cat ${cmd_stdout} && rm -f ${cmd_stdout}
return 0
}
# La pas de log de stderr
SANS_LOG=$(execute_et_log_stderr "" ls -al /home)
# La, il y aura log de stderr dans ${LOGFILE}
LOG_FILE=/var/log/backupeur
AVEC_LOG=$(execute_et_log_stderr "${LOGFILE}" tar -czf /tmp/net.tar.gz /ne)
PS2: Tiens, je revois presque le code proposé à mon premier post :P
PS3: Promis, j'arrête ! C'est mon dernier post sur cette demande (H)
[^] # Re: à l'envers ;-)
Posté par Steve Azriel . En réponse au message stderr dans une variable. Évalué à 1.
Le fichier temporaire créé via mktemp sert à stocker (temporairement) la sortie de la commande, pour laquelle aucun traitement immédiat n'est nécessaire.
Ainsi, après avoir "redirigé" les écritures sur 2(stderr) vers là où est écrit la sortie 1(stdout), tu peux faire de même en envoyant 1(stdout) vers le fichier temporaire.
L'important est de conserver l'ordre des redirections sinon ca ne fait pas ce que l'on souhaite :-)
Une fois que la commande est terminée et que write_log a fini, tu peux lire le contenu du fichier temporaire pour le charger dans une variable (dans ton exemple initial, il s'agissait de TAR).
En espérant avoir pu éclaircir les dernières ambigüités de mon premier commentaire ^__^
Bon courage !
Cdlt,
PS: Pour donner une solution à ton problème, voici le code que je propose et qui utilise un "wrapper" (A TESTER !).
Par avance, je vous remercie pour votre indulgence:
# Les constantes
# HOSTNAME - Nom de la machine
declare -r HOSTNAME="${HOSTNAME:-$(hostname)}"
function execute_et_log_stderr {
# Argument 1: Le fichier de log ou /dev/null :-)
local -r log_stderr="${1:-/dev/null}"
shift
# Une ressource temporaire pour stdout
local -r cmd_stdout=$(mktemp -q)
if [ ${?} -ne 0 ]; then
echo Impossible d"'"allouer une ressource temporaire '!'
return 255
fi
${@} 2>&1 1>"${cmd_stdout}" \
| while read cmd_stderr; do
echo "$(date +%b" "%d" "%T) ${HOSTNAME} backupeur[$$]: ligne :${cmd_stderr}"
done >> ${log_stderr}
cat ${cmd_stdout} && rm -f ${cmd_stdout}
return 0
}
# La pas de log de stderr
SANS_LOG=$(execute_et_log_stderr "" ls -al /home)
# La, il y aura log de stderr dans ${LOGFILE}
LOG_FILE=/var/log/backupeur
AVEC_LOG=$(execute_et_log_stderr "${LOGFILE}" tar -czf /tmp/net.tar.gz /ne)
PS2: Tiens, je revois presque le code proposé à mon premier post :P
PS3: Promis, j'arrête ! C'est mon dernier post sur cette demande (H)