# [OFF/SHELL] Script de tchat en local, des améliorations ?

## RaX

Bonjour,

J'ai écrit un tout petit script au taff (que voulez vous faut bien s'amuser un peu). Je vous le propose ici pour savoir se que vous en pensez et si vous avez des idées pour l'améliorer ce serait encore mieux.

C'est un simple fichier qui fait office de tchat. Je l'ai écrit pour pouvoir dialoguer avec les utilisateurs locaux de la machine.

Ne soyez pas trop dur avec moi le bash, n'est pas mon langage favoris !

http://gdbabar.googlecode.com/svn/msg/xminou << c'est ici

Bonne journée, 

RaX|.Last edited by RaX on Fri May 23, 2008 7:35 am; edited 3 times in total

----------

## kwenspc

Tu peux gérer le signal émis par CTRL+C (SIGTERM ou SIGINT? me souviens plus) avec "trap"

Ça doit faire un truc comme ça je pense:

```

trap quit_chat SIGINT SIGTERM

```

----------

## Mickael

Manque juste des quotes : trap "quit_chat" SIGINT SIGTERM

----------

## kwenspc

Ok merci de la précision  :Smile: 

----------

## Bapt

Question con, pourquoi faire du bash et pas du posix ? ton code ne comprends aucune particularité bash ou presque (lu en travers) il serait donc intéressant de faire du POSIX pour être portable, pour vérifier, tester le script avec ash ou dash, puis remplacer le /bin/bash vers /bin/sh (qui n'est pas un lien vers /bin/bash sur tous les OS)

----------

## RaX

Pour les couleurs ?

Merci pour tips du "trap" ^^.

----------

## geekounet

 *RaX wrote:*   

> Pour les couleurs ?
> 
> Merci pour tips du "trap" ^^.

 

Les couleurs de la façon dont tu les utilises, ça fonctionne quelque soit le shell...  :Rolling Eyes:  C'est une simple séquence d'échappement, qui ne dépend que d'un terminal compatible pour fonctionner, rien à voir avec le shell.

Par contre, si t'avais eu la bonne idée d'utiliser zsh, ya des facilités pour avoir les codes de couleurs  :Wink: 

----------

## RaX

Sous un shell Ubuntu (c'est pas mon serv !) avec le "#!/bin/sh" il ne gère pas correctement les couleurs. Voila ce que j'ai dans la sortie :

 "-e \e[0;33m(17:48:21)\e[0;32m * rax has joined\e[0m". 

Voila pourquoi j'ai utilisé bash.

----------

## geekounet

Fais sauter le -e, et remplace les \e par des les vrais échappements : ^[  ("Ctrl-V ESC" avec l'éditeur du bien ;p)

----------

## RaX

 *Quote:*   

> Fais sauter le -e, et remplace les \e par des les vrais échappements : ^[ ("Ctrl-V ESC" avec l'éditeur du bien ;p)

 

hihi oki, je fait ça  :Smile:   (J'avais prévenu, je suis vraiment pas bon !!!)

Mais bon avec Geekounet, les gentils forumeurs et VIM+Google ça va p-e tenir a peu près la route au final.

En tous cas merci beaucoup  :Smile: 

----------

## RaX

Nickel pour les couleurs, Oserais-je vous demander si il est possible de remplacer les "\n" d'une manière similaire ??? (ha ba oui j'ai osé) 

Ou dois-je faire des :

```
echo ""
```

Je cherche sur G[maitre du monde]oogle. Si vous répondez avant ... temps mieux  :Smile: 

----------

## geekounet

C'est mieux lisible de faire des echo pour chaque ligne même vide, sans être trop moche. Mais bon sinon, suffit d'un Ctrl-V <enter>, ça marche pour les codes de toutes les touches ça  :Wink: 

----------

## RaX

Ouep c'est ce que j'ai fait mais ça ne saute pas de ligne, enfin les echo "" ça me va très bien, dernier bug sous Ubuntu (Je vous jure c'est pas une machine à moi) quand je repasse sous sh il ne reconnait pas les signaux SIGTERM SIGINT. Je cherche et je poste ici si je trouve quelque chose. 

 *Quote:*   

>  En fait suffisait juste de virer le "SIG" SIGTERM devient TERM; SIGHUP devient HUP

 

(9h10 et j'ai tjs pas commencé a bosser outchhh.)

----------

## kwenspc

 *RaX wrote:*   

> 
> 
> (9h10 et j'ai tjs pas commencé a bosser outchhh.)

 

10h20 ici et tout pareil  :Mr. Green:  mais c'est pas un mal de temps en temps.

----------

## Desintegr

Je pense qu'echo tout seul est plus joli qu'echo "".

----------

## RaX

 *Quote:*   

> Je pense qu'echo tout seul est plus joli qu'echo "".

 

Mhouaii a vrai dire j'ai tjs mis les "", pourquoi ?? J'ai pas vraiment d'explication mais c'est un "TIC" de syntaxe ^^

----------

## truc

iop, sympa ton petit chat  :Wink: 

quelques commentaires en vrac puisque c'est ce que tu demandes  :Smile: 

* juste parce que j'aime bien sed... mais il est possible d'utiliser le même trick avec grep.. (puis ton cut):

Pour la liste d'utilisateurs:

```
ps aux| sed -n "\#[f] $FILE_SOCKET#s/ .*//p"
```

* la commande /list n'est pas dans le menu /help!  :Wink: 

* Et il faudrait que tu rajoutes un quit_chat après ton "while read MSG", pour le cas ou l'utilisateur quitte par un simple ^D ( et donc pour tuer le tail -f qui tourne et ajouter un zoli message pour les zautres)

* Et pourquoi finir ton script par un "exit 1", si justement l'utilisateur  termine par un ^D, c'est qu'à priori tout s'est bien passé nan?

* Ah, si aussi, 

```
"_"*)

   #MSG=`echo $MSG | sed 's/_//1'`

   MSG="${MSG:1}"

   if [ ! "$MSG" = "" ]; then

     write_msg "$MSG"

   fi  

   ;;  

```

Pas besoin de sed ni echo pour ça  :Smile: 

*  Et puis en fait, si tu rendais l'espace après une commange obligatoire (style "/miaou txt" ou lieu de "/miaoutxt"), alors tu peux te permettre de te faire un traitemeent un peu plus générique (toujours le bienvenu en général..),:

quand tu optiens le contenu de ta variable ACTION, ou TXT, En gros ce que tu souhaites c'est supprimer le premier mot si il commence par un '/', tu peux faire un truc plus générique et le reprendre à chaque fois style:

```
 TXT=`echo "$1" | sed 's#^/[^ ]* ##'`
```

quand tu fais ça tu vois, qu'en fait tu pourrais même te passer de sed, et ne te servir que des fonctions d'expansion des 'paramètres' du shell (POSIX):

```
TXT="${1#/* }"
```

Ca devrait déjà simplifier ton code, et accélérer un peu le bouzin, mais... ça t'apporte un petit problème... Tu dois gérer les commandes envoyées sans argument différemment ( par exemple ne plus accepter: '/miaoutest' mais uniquement '/miaou test'  pareil, /miaou seul ne devrait plus fonctionner exactement comme tu l'avais prévu, mais j'pense qu tu pourras faire joujou avec tout ça tout seul  :Smile: 

* Et un dernier point: au lieu de faire appel à la commande 'whoami', interroge plutôt directement la variable $USER, ça fera toujours ça de gagné, et puis si vraiment tu y tenais, stocke la sortie de cette commande dans une variable et n'affiche plus après que cette variable.

Et a titre d'info, pour une substitution avec sed s/pattern//, sed ne va modifier par défaut que la première occurence de pattern, il est donc inutile de le lui préciser  (s/pattern//1)

De même si tu veux afficher plusieurs ligne de texte, tu peux le faire avec echo comme tu l'as fait, mais également avec cat et ton shell par exemple

```
cat <<BLAH

1ère ligne

2ème ligne

3ème ligne

BLAH
```

Regarde dans (par exemple pour les puristes..) man bash, et cherche la section "Here Documents", tu verras ainsi que tu peux faire un cat<<BLAH, cat<<'BLAH', cat<<-BLAH, etc... bref, à regarder, c'est important et interessant  :Smile: 

----------

## RaX

Merci "truc" je regarde plus en détails tes suggestions  demain et j'intègre tout ça, c'est vraiment cool, ça me permet d'avancer un petit peu en scripting. C'était vraiment l'objet de mon message ici  :Smile: 

----------

## RaX

le Boune Shell, n'aime pas bcp les ${VAR:1} il me sort un "Syntax error: Bad substitution" c'est triste :'(

sous "dash" même sous Ubuntu (outchh) /bin/sh -> dash

----------

## truc

C'est pas grave, on peut feinter...

```
echo ${VAR#?}
```

mouhahahahah (rire démoniaque... tout le monde l'aura reconnu...   :Razz:   )

(Vérifié avec le sh de busybox)

----------

## kwenspc

Quelle encyclopédie du shell ce truc!

Quoi quel truc? bah: truc! On parle pas d'un truc mais de truc, où t'as vu un truc toi? --> []

----------

## RaX

Nan mais ouhai !! mais là c'était facile !! (c'est ce que ont dit toujours après avoir eût la réponse), mais plus dur un truc style  ${VAR:2:1} c'est possible ??

(J'abuse du savoir de ce brave truc)

----------

## Oupsman

Tient une réécriture de la commande talk  :Rolling Eyes: 

----------

## RaX

 *Quote:*   

> Tient une réécriture de la commande talk 

  C'est exactement ça sauf que là on a le droit de faire des /homer !

----------

## truc

 *RaX wrote:*   

> Nan mais ouhai !! mais là c'était facile !! (c'est ce que ont dit toujours après avoir eût la réponse), mais plus dur un truc style  ${VAR:2:1} c'est possible ??
> 
> (J'abuse du savoir de ce brave truc)

 

 :Twisted Evil:  tout est possible! C'est juste que ça ne sera pas forcément aussi lisible au final que de faire un sed.. (la il faudrait enchainer quelques commandes plus ou moins obscures pour pouvoir arriver à ce résultat, style(toujours avec le sh de busybox): 

```
~ $ TT=123456789

~ $ echo ${TT:2:3}

sh: Syntax error: Bad substitution

~ $ # normalement avec bash: ${TT:2:3} => 345

~ $ len=${#TT}

~ $ echo $len

9

~ $ nb=$(($len - (2 + 3)))

~ $ echo $nb

4

~ $ 

~ $ while [ $nb -gt 0 ] ; do TT="${TT%?}" ; nb=$(($nb - 1)) ; done

~ $ echo $TT

12345

~ $ 

~ $ nb=2

~ $ while [ $nb -gt 0 ] ; do TT="${TT#?}" ; nb=$(($nb - 1)) ; done

~ $ echo $TT

345

```

Autant dire que c'est plus laborieux, et que soit il vaut mieux utiliser un vrai shell avec des vraies fonctions pour simplifier la vie (oui dans la vie faut avancer quoi...) soit il vaut mieu utiliser sed  :Wink: 

Voilai-voilou....

----------

