afficher au term une trentaine de lignes et mettre la dernière dans une variab le
Le
Une Bévue
je me connecte par ssh pour faire tourner un script qui sort une 30taine
de lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL :")
pour la mettre dans une variable "URL" que j'envoie en local sur un
butineur.
pour l'instant, je fais ça :
#!/usr/bin/zsh
URL=(`/usr/bin/xclip -o`)
SRV=yt@iMac
RMT_HOME="/Users/yt"
RMT_RECETTE="${RMT_HOME}/bin/recette"
URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" |
grep -A 1 "iMac's URL :" | tail -n 1 `)
/usr/bin/xdg-open ${URL}
exit 0
mais là, je ne vois plus du tout la 30taine de lignes, elles sont
mangées par | grep -A
je sais qu'ils existent des pipes nommés, mais ne sais pas les utiliser.
des exemples ?
mon but, donc est de sortir au term la trentaine de lignes tout en
plaçant la dernère dans une variable.
de lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL :")
pour la mettre dans une variable "URL" que j'envoie en local sur un
butineur.
pour l'instant, je fais ça :
#!/usr/bin/zsh
URL=(`/usr/bin/xclip -o`)
SRV=yt@iMac
RMT_HOME="/Users/yt"
RMT_RECETTE="${RMT_HOME}/bin/recette"
URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" |
grep -A 1 "iMac's URL :" | tail -n 1 `)
/usr/bin/xdg-open ${URL}
exit 0
mais là, je ne vois plus du tout la 30taine de lignes, elles sont
mangées par | grep -A
je sais qu'ils existent des pipes nommés, mais ne sais pas les utiliser.
des exemples ?
mon but, donc est de sortir au term la trentaine de lignes tout en
plaçant la dernère dans une variable.

Poser une question


j'ai une première solution, qui ne me convient pas :
STDOUT=`/usr/bin/ssh ${SRV} "${RMT_RECETTE_TEE}"`
echo "STDOUT :n${STDOUT}"
URL=(`echo ${STDOUT} | grep -A 1 "iMac's URL :" | tail -n 1 `)
echo "URL = ${URL}"
car la sortie de STDOUT vient d'un seul coup (j'ai mis des sleep 0.5
dans le script distant)
ce qu'il me faudrait, c'est lire au fur et à mesure la sortie de :
/usr/bin/ssh ${SRV} "${RMT_RECETTE_TEE}"
envoyer ça vers deux commandes simultanément, ie. echo et grep
donc sur deux fifos.
En plaçant un "tee" avant le "grep", et en lui faisant écrire dans le
terminal courant ?
TTY=`tty`
URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" | tee
$TTY | grep -A 1 "iMac's URL :" | tail -n 1 `)
ouais, super, merci bien.
j'ai essayé avec un pipe nommé, ça ne marche pas tjs, il ne reçoit
(lecture) pas toutes les lignes tout le temps...
Pourquoi pas :
script -c "/usr/bin/ssh .../..." /tmp/out$$
URL=`cat /tmp/out$$ | grep -A 1 "iMac's URL :" | tail -n 1
rm /tmp/out$$
Une Bévue
C'est vraiment forcément la dernière ? Si c'est le cas :
ssh tacommande | while read l
do
# C'est bourrin mais ça donne le bon résultat au final.
URL="$l"
echo "$l"
done
tonbutineur "$URL"
Si ce n'est pas forcément la dernière :
nextline=0
ssh tacommande | while read l
do
# C'est moins bourrin mais c'est plus lent.
[[ $nextline -eq 1 ]] && { nextline=0 ; URL="$l" }
echo "$l" | fgrep -q 'iMac.s URL' && nextline=1
echo "$l"
done
tonbutineur "$URL"
--
Arnaud
http://blogs.glou.org/arnaud/