OVH Cloud OVH Cloud

Un fifo?

15 réponses
Avatar
Kevin Denis
Bonjour,

je suis en train de regarder le redirect_program de squid.

Un exemple de ce qui marche, (en perl):

#!/usr/bin/perl
$|=1;
while(<>)
{
s@http://www.microsoft.com@http://www.kernel.org@;
print;
}

En gros, le prog attend une entree, et la transforme.

Maintenant, je voudrais ecrire la meme chose, mais en bash.

Le truc simple comme:
#!/bin/bash
URL=$1
lynx -dump -source | clamdscan - --quiet
if [ $? -eq 0 ]
then
echo $URL
else
echo http://www.virus-jackal.net/infected.php
fi

ne fonctionne pas. Je pense que c'est du au fait que le programme
doit boucler sur lui meme. Mais comment recuperer le $1? Avec un fifo
je pense, mais comment?

Merci

--
Kevin

5 réponses

1 2
Avatar
cedric
Stephane Chazelas wrote:
Ne pas mettre de quotes autour d'une variable permet de forcer
le decoupage en plusieurs /mots/ et de faire d'/expander/ les
/wildcards/ dedans. Donc, une variable hors de ses quotes est
une liste de patterns de fichiers (separes par les caracteres
d'IFS). Si elle ne doit pas etre vue comme telle, alors les
quotes sont necessaires.

file_list='/tmp/*.txt /tmp/*.html'
set +f; IFS=" "; cmd -- $file_list

file='/tmp/foo.txt'
cmd -- "$file"


Apparement, en ZSH, ca ne fonctionne pas comme ca par défaut : quotes ou
pas, $file_list constituera un seul argument... À moins d'initialiser le
flag SH_WORD_SPLIT...

Avatar
Stephane Chazelas
2005-02-03, 11:07(+01), cedric:
[...]
file_list='/tmp/*.txt /tmp/*.html'
set +f; IFS=" "; cmd -- $file_list

file='/tmp/foo.txt'
cmd -- "$file"


Apparement, en ZSH, ca ne fonctionne pas comme ca par défaut : quotes ou
pas, $file_list constituera un seul argument... À moins d'initialiser le
flag SH_WORD_SPLIT...


Oui, on peut dire que zsh (sauf dans les emulations sh et ksh) a
corrigé ce probleme. Toutefois,

cmd -- $var

reste un probleme en zsh dans le cas ou $var est vide, car alors
$var est transformé en pas d'argument du tout au lieu d'etre
transformé en un argument vide.

Meme probleme pour

array=(
'1er arg'
''
'3e arg'
)
cmd -- $array

Où les elements vides sont omis.

Ca devient pire dans:

typeset -A hash
hash=(
a 'foo'
b ''
c 'bar'
d ''
)

avec:

typeset -A other_hash
other_hash=(
${(kv)hash}
) # kv pour Key + Value

$ echo $other_hash[b]
c

D'ou l'interet d'utiliser:

cmd -- "$var"
cmd -- "${array[@]}"
cmd -- "${(@)array}"
cmd -- "${(@kv)hash}"
other_hash=("${(@kv)hash}")

Mais bon, je parlais de syntaxe POSIX, et en mode POSIX (sh),
zsh a les memes problemes, puisque ce comportement est requis
par POSIX.

--
Stéphane


Avatar
Vincent Bernat
OoO En cette fin de matinée radieuse du jeudi 03 février 2005, vers
11:07, cedric disait:

Apparement, en ZSH, ca ne fonctionne pas comme ca par défaut : quotes ou
pas, $file_list constituera un seul argument... À moins d'initialiser le
flag SH_WORD_SPLIT...


D'ailleurs, je n'ai pas compris comment couper une variable en
plusieurs arguments en l'absence de ce flag. Je suppose qu'il doit
bien y avoir un moyen simple.
--
BOFH excuse #140:
LBNC (luser brain not connected)

Avatar
Stephane Chazelas
2005-02-03, 15:22(+01), Vincent Bernat:
OoO En cette fin de matinée radieuse du jeudi 03 février 2005, vers
11:07, cedric disait:

Apparement, en ZSH, ca ne fonctionne pas comme ca par défaut : quotes ou
pas, $file_list constituera un seul argument... À moins d'initialiser le
flag SH_WORD_SPLIT...


D'ailleurs, je n'ai pas compris comment couper une variable en
plusieurs arguments en l'absence de ce flag. Je suppose qu'il doit
bien y avoir un moyen simple.


$=var

coupe en utilisant IFS

${(s:,:)var}

coupe en utilisant des virgules

${(z)var}

coupe en utilisant le tokeniser du shell.

${(f)var}

coupe suivant les sauts de ligne.

Exemples:

$ var='"a, b" c d'
$ printf '<%s>n' $var
<"a, b" c d>
$ printf '<%s>n' $=var
<"a,>
<b">
<c>
<d>
$ printf '<%s>n' ${(s:,:)var}
<"a>
< b" c d>
$ printf '<%s>n' ${(z)var}
<"a, b">
<c d>
$ printf '<%s>n' ${(Q)${(z)var}}
<a, b>
<c d>

A adapter suivant comment on veut traiter les champs vides.

--
Stéphane


Avatar
Kevin Denis
Le 03-02-2005, Stephane Chazelas a écrit :

Ne pas mettre de quotes autour d'une variable permet de forcer
le decoupage en plusieurs /mots/ et de faire d'/expander/ les
/wildcards/ dedans. Donc, une variable hors de ses quotes est
une liste de patterns de fichiers (separes par les caracteres
d'IFS). Si elle ne doit pas etre vue comme telle, alors les
quotes sont necessaires.

ok


- ne pas utiliser echo


var="-n"

var=''

Le resultat de:

echo "$var"

n'est pas garanti.

certes


Le resultat de

printf '%sn' "$var"

l'est.

ok.


- [ "$?" -eq 0 ] est une noop


noop? no operation?


C'est une no-op dans le sens ou elle ne sert a rien.

J'ai compris apres post. A l'origine j'avais des:

<snip>
lynx -dump -accept_all_cookies -source $cuturl | clamdscan - --quiet
RES=$?
echo -n URL: >> /tmp/viruslog
echo -n $URL >> /tmp/viruslog
echo $RES >> /tmp/viruslog
if [ $RES -eq 0 ]
<snip>

- faire gaffe avec l'entree standard.

comment recuperer a coup sur _toute_ l'entree standard? J'ai l'impression

que squid fait plus que donner l'URL au redirect_program, et je voudrais
dissequer un peu tout ca.


Tu la recuperes toute. Ce que je voulais dire, c'est que comme
toutes les commandes lancees dans ce script ont leur entree
standard connectee vers cette liste d'URL, si par hasard l'une
de ces commandes veut poser une question a l'utilisateur, elle
va lire la reponse sur son entree standard, mais donc depuis la
liste de fichier, au lieu de l'utilisateur.

Ok. Mais c'est curieux, les sites a cookie (genre webmail) ne passent

pas avec ce prog. J'ai bien des demandes de cookie, mais j'ai des
authentification refused.
(enfin, c'est pas le sujet du newsgroup ici).

- on reserve souvent (par convention) les noms de variables en
majuscule pour les variables d'environnement.
Ce n'est pas une regle d'or toutefois. Par exemple, IFS et PS1


ne sont pas par defaut dans l'environnement (et n'ont rien a y
faire)

Environnement, dans le sens "global a la machine" et non "global pour

un user"?

--
Kevin



1 2