Perdu avec els simples et doubles quotes de BASH!

Bonjour tout le monde,

Après avoir lu des dizaines de pages sur BASH, je n’arrive toujours pas à faire le petit script suivant pour compiler l’outil weighttp !

Dans une session terminal, si je passe la commande suivante :

gcc -g2 -O2 -DVERSION='"123"' src/*.c -o weighttp -lev -lpthread

tout ce passe bien et weighttp est compilé. :041

Mais si je mets la même commande dans un script compile.sh…

[quote]#!/bin/bash
gcc -g2 -O2 -DVERSION=’“123”’ src/*.c -o weighttp -lev -lpthread[/quote]
alors ça ne fonctionne pas ! :119

J’ai bien essayé de mettre des \ devant les ’ et devant les " , ou même d’inclure la ligne complète dans des " mais toujours le même résultat. :doh:

Est-ce quelqu’un serait en mesure de me corriger.

Merci d’avance.

Rien avoir avec les quotes tu confonds la lettre « O » et le chiffre 0 (« zéro »). La bonne notation c’est avec le premier.

EDIT: Les scripts pour compiler c’est mal. Un Makefile c’est tellement mieux :

[code]SRC=$(wildcard src/*.c)
OBJ=${SRC:.c=.o}
CFLAGS=-g2 -O2 -DVERSION=’“123”'
LDFLAGS=-lev -lpthread
NAME=weighttp

all: $(NAME)

$(NAME): $(OBJ)
$(CC) $(LDFLAGS) $^ -o $@

.o.c:

clean:
@rm -v $(OBJ)[/code]
C’est une version simple, le mieux c’est de créer un dossier build qui contient tous les fichiers objets (*.o). Plus grave par contre la version que je donne ne gère pas les fichiers d’entête.

On va dire que je te les laisse en exercice si tu veut te mettre à utiliser make. :slightly_smiling:

Je ne vois pourtant que des O ( “eau” ) dans les lignes postées par Fnux…

Dans son “code” il y a “02” alors que dans sa citation il y a “O2” … pas facile de voir la différence. Suivant la police de caractère le zéro est plus ovale et le “O” plus rond.

Ouai et je me suis fait avoir par le forum la police classique et celle du texte dans les balises code ne sont pas les même et n’affichent pas les O de la même façon…

Par contre il va nous en falloir plus pour savoir quel est le problème. Par exemple quel est l’erreur ?

Bonjour,

Je suis vraiment désolé de contredire Mimoza et MisterFreeze.

Il y a bien un “o MAJUSCULE” soit “O2” et non pas un zéro “0” dans la ligne de commande, aussi bien dans le code que dans la citation.

Mauvais exemples avec zéro “0”:

#!/bin/bash gcc -g2 -02 -DVERSION='"123"' src/*.c -o weighttp -lev -lpthread
Et dans ce cas là, ça ne POURRAIT effectivement PAS fonctionner.

Bons exemples avec o MAJUSCULE “O” (copié/collé de mon message initial):

#!/bin/bash gcc -g2 -O2 -DVERSION='"123"' src/*.c -o weighttp -lev -lpthread
Et dans ce cas ça “devrait” fonctionner.

Il y a donc bien un problème de simple ou de double quotes dans mon script (compile-weighttp.sh) car à priori et d’après le peu que j’ai compris de l’interpréteur bash, celui-ci interprète bien les simples et double quotes mais de manières différentes et aussi différemment entre un script et une ligne de commande, sauf si l’on utilise des \ et-ou des / bien placés.

Mais aucun exemple n’est donné dans aucune doc sur le besoin de voir une simple quote (’) suivie d’une double quote (") et aussi son inverse (") suivie de (’) pour être interprétées par bash comme simple caractère et non pas comme une commande comme c’est le cas pour entourer la valeur 123 de cette ligne de compilation.

Il y a aussi peut-être un problème avec le / de src/*.c ?

Exemple qui “devrait” fonctionner dans uns script .sh mais non : #!/bin/bash gcc -g2 -O2 -DVERSION=/'/"123/"/' src/*.c -o weighttp -lev -lpthread
J’ai essayé à peut près toutes les combinaisons possibles mais rien à faire ! :doh:

Et je rappelle que cette ligne de commande fonctionne très bien lorsqu’elle est lancée toute seule dans un terminal ! :dance:

Que faire alors pour automatiser cette ligne de commande dans un script .sh ?

@MisterFreeze: Ta solution d’utiliser un make est certainement bien plus efficace, mais pour l’instant c’est totalement hors de la portée de mes pauvres connaissances et de mes piètres capacités. :079

@Mimoza: Le problème avec le script .sh de mon premier post est justement qu’il n’y a pas de message d’erreur ! La compilation ne s’effectue tout simplement pas, alors que comme déjà dit, la ligne de commande fonctionne parfaitement et génère bien l’exécutable demandé ! Oops !

Ce script est la partie finale d’un script bien plus complet qui est destiné à installer l’utilitaire weighttp, qui lui-même s’appuie sur libev.

Voici le code complet de ce script.

[code]#!/bin/bash

Download and Install both libev and weighttp.

cd Downloads
wget http://dist.schmorp.de/libev/libev-4.15.tar.gz
tar -xzf libev-4.15.tar.gz
apt-get -y build-dep libev
apt-get -y install libev-dev
cd libev-4.15
./configure
make
sudo make install
cd …
wget http://cgit.lighttpd.net/weighttp.git/snapshot/weighttp-master.tar.gz
tar -xzf weighttp-master.tar.gz
cd weighttp-master
gcc -g2 -O2 -DVERSION=’“123”’ src/*.c -o weighttp -lev -lpthread <- Here is where I’ve a problem because of the single and double quotes!
sudo cp ./weighttp /usr/local/bin
cd …/…[/code]
Tout fonctionne bien sauf évidemment les 2 dernières lignes que je dois lancer manuellement dans une console !

Merci d’avance si quelqu’un a une idée car je suis bien bloqué.

Et sinon c’est quoi ton problème ? Tu as un message d’erreur ou un comportement quelconque à part « ça marche pas » ?

Contrairement à ce que tu dis ce n’est pas parce que l’erreur de l’option pour optimiser la compilation est écartée que c’est forcément une erreur de simple ou double guillemets (d’ailleurs le fait que cela fonctionne en interactif montre que l’erreur ne vient pas de là).

Sans que cela soit un problème ton script ne gère pas super bien le déplacement dans les répertoires. Le premier cd est dépendant du répertoire d’où tu appel ton script, donc tu n’a pas de garanti qu’il y ai un répertoire Download. Je présume que tu voudrais plutôt faire :

[code]cd “${HOME}/Download”

ou

cd ~/Download[/code]
Le dernier cd est inutile car les cd dans ton script n’influent pas sur le répertoire de travail de celui qui lance le script.

D’autre part une bonne pratique au lieu d’utiliser ~/Download serait d’utiliser un répertoire temporaire. Pour ça à la place du "cd “${HOME}/Download”, je ferais plutôt :

tmpdir="$(mktemp -d)" cd "${tmpdir}"
Éventuellement à la fin du script tu peut supprimer le dossier (sinon il le sera au prochain redémarrage).

ok désolé … si la police est litigieuse aussi :unamused:

Bonjour MisterFreez

[quote=“MisterFreez”]Et sinon c’est quoi ton problème ? Tu as un message d’erreur ou un comportement quelconque à part « ça marche pas » ?

Contrairement à ce que tu dis ce n’est pas parce que l’erreur de l’option pour optimiser la compilation est écartée que c’est forcément une erreur de simple ou double guillemets (d’ailleurs le fait que cela fonctionne en interactif montre que l’erreur ne vient pas de là).[/quote]
Ca doit simplement venir du fait que j’ai “beaucoup” bricolé mon système, et qu’à force de faire des con…ries, j’ai du planter quelque chose.

Mais comme je n’y arrivais pas, j’ai refait une “clean install” de mon serveur, et maintenant, comme par magie, mon script fonctionne.

Et il fonctionne même dans la version d’origine qui utilise waf tout comme avec la ligne de compilation qui maintenant fonctionne aussi. :dance:

[quote=“MisterFreez”]Sans que cela soit un problème ton script ne gère pas super bien le déplacement dans les répertoires. Le premier cd est dépendant du répertoire d’où tu appel ton script, donc tu n’a pas de garanti qu’il y ai un répertoire Download. Je présume que tu voudrais plutôt faire :

[code]cd “${HOME}/Download”

ou

cd ~/Download[/code]
Le dernier cd est inutile car les cd dans ton script n’influent pas sur le répertoire de travail de celui qui lance le script.

D’autre part une bonne pratique au lieu d’utiliser ~/Download serait d’utiliser un répertoire temporaire. Pour ça à la place du "cd “${HOME}/Download”, je ferais plutôt :

tmpdir="$(mktemp -d)" cd "${tmpdir}"
Éventuellement à la fin du script tu peut supprimer le dossier (sinon il le sera au prochain redémarrage).[/quote]
Merci de ces infos à propos de “${HOME}/Download” que je ne connaissais pas.

J’ai modifié mon script en conséquence, et maintenant, comme je ne veux pas supprimer immédiatement le répertoire temporaire, il fait ce qui suit:

[code]#!/bin/bash

wsbt.sh

Download and install weighttp and clwsbt, two benchmark tools stressing any

web servers on modern multi core CPUs (AMD and Intel).

Launch this installation script with root privileges (sudo or su) from your

/home directory.

e.g. sudo sh wsbt.sh

mkdir “${HOME}/Temp_WSBT”
cd “${HOME}/Temp_WSBT”
wget http://dist.schmorp.de/libev/libev-4.15.tar.gz
wget http://cgit.lighttpd.net/weighttp.git/snapshot/weighttp-master.tar.gz
wget http://www.as2.com/linux/tools/clwsbt.tar.gz
tar -xzf libev-4.15.tar.gz
tar -xzf weighttp-master.tar.gz
tar -xzf clwsbt.tar.gz
apt-get -y build-dep libev
apt-get -y install libev-dev
cd “${HOME}/Temp_WSBT/libev-4.15”
./configure
make clean
make
make install
cd “${HOME}/Temp_WSBT/weighttp-master”
./waf configure
./waf build
./waf install

Note:

If you can’t make waf working on your system, use the following commands

from /home/Temp_WSBT/weighttp-master to compile weighttp and copy it into

the right place:

gcc -g2 -O2 -DVERSION=’“123”’ src/*.c -o weighttp -lev -lpthread

sudo cp ./weighttp /usr/local/bin

cd “${HOME}/Temp_WSBT”
gcc -O2 clwsbt.c -lpthread -o clwsbt
chmod -R 777 “${HOME}/Temp_WSBT”
cd “${HOME}”
echo “-------------------------------------------------------------------------”
echo “weighttp and clwsbt are installed.”
echo " "
echo "To use weighttp, simply start the command: weighttp -h "
echo " "
echo “By default, clwsbt stress a web server listening on the TCP port 8080”
echo “with a static file named 100.html but you can use any other static file”
echo “or even a dynamic content.”
echo " "
echo “However, using large files or big generated dynamic contents stress more”
echo “first the I/O system and the TCP stack than the real capabilities of your”
echo “web server to support large simultaneous loads!”
echo " "
echo “In the same spirit, it’s obvious to use both of these tools with localhost”
echo “connections to avoid the latency of the network.”
echo " "
echo “To use clwsbt:”
echo “launch from your /home/Temp-WSBT folder the following command:”
echo “./clwsbt name_of_your_web_server”
echo “e.g.: ./clwsbt apache2 or ./clwsbt cherokee or ./clwsbt nginx etc.”
echo " "
echo “To stress your web server on another TCP port, please check the”
echo “clwsbt.c source file, and modify the relevant declarations such as”
echo “the listening port, but also the name of the result file, etc…”
echo “Then recompile clwsbt.c using the script compile-clwsbt”
echo " "
echo “e.g. to stress Nginx listening on the port 80 please do the following:”
echo " "
echo “- modify the declaration #define PORT value to 80”
echo “- modify the declaration #define RESFILE value to nginx-results.txt”
echo “- save the source file clwsbt.c as clwsbt-nginx.c”
echo "- compile the new file with the command: "
echo “sudo gcc -o2 clwsbt-nginx.c -lpthread -o clwsbt-nginx”
echo “- put the 100.html file into the /www folder of Nginx”
echo “- restart Nginx”
echo “- start the command: ./clwsbt-nginx nginx”
echo " "
echo “Then compare the results with what you get with other web servers such”
echo “as apache2, cherokee, lighttpd, nginx, g-wan, etc. :=}”
echo “-------------------------------------------------------------------------”
echo " "
[/code]
J’espère que c’est ainsi plus propre et explicite si jamais ça peut servir à d’autres.

Merci encore de tes infos.

Salut.

C’est pas grave.

Moi, vu mon age, j’ai corrigé ce problème avec des lunettes loupes à 9.95 € plus fortes :079 et aussi j’évite la police :030 :033 :laughing: