Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/05/2011, 19h11   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 10
Points : 11
Points : 11
Par défaut Appel de commande dans une variable

Bonjour,

je dois modifier un script shell et je suis complètement novice dans le domaine.

Je m'arrache les cheveux sur quelque chose qui me semblait pourtant être d'une facilité déconcertante... cela montre mon niveau...

Je veux simplement exécuter dans mon script shell une commande qui est positionnée dans une variable. Je précise que la commande est une commande "complexe" (enchainement de commandes avec pipe).

Pour simplifier, prenons l'exemple suivante :
Code :
1
2
TOTO="ls | cat"
$TOTO
Je pensais que la ligne "$TOTO" allait permettre d'exécuter ma commande "ls | cat" mais apparament non.
Cela fonctionne pour des commandes non enchainées (sans pipe) mais pas pour des commandes enchainées.

J'ai également essayé avec
Code :
1
2
TOTO="ls | cat"
`$TOTO`
mais cela ne fonctionne pas non plus.

Est-ce ce quelqu'un est en mesure de m'expliquer pourquoi cela ne fonctionne pas, et surtout, comment faire pour y parvenir...

J'avais prévenu que ça n'était pas d'un haut niveau

Merci par avance
Fanny28 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 20h47   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,


c'est, ainsi que le montre la sortie de , comme si tu tapais :; or, les apostrophes protègent la commande pipe (|) d'être interpétée.

le conseil commun, pour les commandes complexes, est d'utiliser une fonction :
Code :
mesCmd() { cmd1 | cmd2 ;}
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/05/2011, 09h52   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 10
Points : 11
Points : 11
Bonjour,

merci beaucoup pour ta réponse

Effectivement, cela fonctionne comme cela...

En revanche, cela va compliquer mon code. En gros, je gérais des appels à find avec des commandes complexes différentes.

Code :
1
2
3
4
5
6
 
case $TOTO in
	1) MON_FIND="find ... | ..."
        2) MON_FIND="find ... | ..."
        ...
$MON_FIND > toto
Cela veut dire que je dois créer autant de fonctions que de cas :

Code :
1
2
3
4
5
 
case $TOTO in
	1) ma_fonction_1 > toto
        2) ma_fonction_2 > toto
        ...
Confirmes-tu que c'est comme cela que je dois m'y prendre ? Cela me semble faire beaucoup de fonctions à créer pour un code si simple
Fanny28 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/05/2011, 10h09   #4
Membre expérimenté
 
Homme
Inscription : juillet 2007
Messages : 437
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : juillet 2007
Messages : 437
Points : 558
Points : 558
Salut,

Tu peux aussi faire d'une autre manière comme ça :
Code :
1
2
3
 
MesDossiers=`ls`
echo $ls
Ou encore une autre :
Code :
1
2
3
 
MesDossiers="ls"
eval $MesDossiers
Luc1an0 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 12h58   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Je ne vois pas ce que ça change :
Code :
1
2
3
4
5
case $TOTO in
	1) monFind() { find ... | ...;}
        2) monFind() { find ... | ...;}
        ...
monFind > toto
si éventuellement tu ne te ressers pas de la fonction plus tard dans ton script, et que ton case n'affiche rien d'autre sur la sortie standard :
Code :
1
2
3
4
5
case $TOTO in
	1) find ... | ...
        2) find ... | ... 
        *) echo "erreur" >&2
esac > toto
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 13h03   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par Fanny28 Voir le message
Cela me semble faire beaucoup de fonctions à créer pour un code si simple
Sans voir ton code dans sa totalité et sans en connaitre la finalité, difficile de dire si c'est trop lourd et de t'aider à optimiser le tout
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/05/2011, 13h10   #7
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Autre solution si tes commandes sont similaires, alimenter une ou plusieurs variables dans le case qui sera(ont) utilisée(s) après coup pour comme argument de tes commandes :

Code :
1
2
3
4
5
case $TOTO in
	1) MON_FIND="..."
        2) MON_FIND="..."
        ...
find ... $MON_FIND ... | ... > toto
Attention, car selon les options, tu pourrais avoir à utiliser xargs pour construire les arguments de find :
Code :
1
2
3
4
5
case $TOTO in
	1) MON_FIND="..."
        2) MON_FIND="..."
        ...
echo $MON_FIND | xargs find | ... > toto
Mais bon, avec un exemple complet, on pourrait te donner une vraie bonne méthode, car cela dépend beaucoup de ce que tu cherches à faire exactement

Si cela se trouve, tu n'as peut-être même pas besoin d'un pipe ?!
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 17/05/2011, 17h54   #8
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Veuillez pardonner mon ignorance, mais :

Citation:
Envoyé par Fanny28 Voir le message
Code :
1
2
TOTO="ls | cat"
$TOTO
Pourquoi ne pas se contenter d'un :

Code :
1
2
TOTO="ls | cat"
eval "$TOTO"
Ce qui semble très bien marcher chez moi ?
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 18h09   #9
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 10
Points : 11
Points : 11
Ouah, je ne pensais pas avoir autant de réponses, merci à tous .

Je n'ai pas donné trop de détails car je ne souhaitais pas que des gens perdent trop de temps à effectuer mon travail
Je voulais donc une petite aide sur quelque chose qui me semblait basique, ce que j'ai largement obtenu, et après, c'est à moi de m'y coller quand même.

La solution proposée par FRUiT semble fonctionner (je ne l'ai pas encore testée dans mon script mais sur des petits tests à côté).
Y-a-t-il une raison pour que les autres membres n'aient pas proposé cette solution ?
Est-ce que vous n'y aviez pas pensé ou est-ce volontaire parce qu'il faut éviter d'utiliser eval (je ne sais pour quelle raison).

Du coup, je passe le problème à résolu même si FRUiT et moi attendons de savoir si l'utilisation de eval est correcte. J'espère que c'est la bonne procédure.

En tout cas, encore un grand merci à tous !
Fanny28 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 18h53   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
en l'occurrence, je ne l'ai pas proposé, parce que je ne vois pas de bonne raison de activer un comportement qui a été inhibé.

l'utilisation d'une fonction est beaucoup plus simple
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 19h46   #11
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par Fanny28 Voir le message
La solution proposée par FRUiT semble [...]
Rendons à César etc... En fait ce serait plutôt la solution qu'a proposé Luc1an0. Comme je l'utilise aussi dans un de mes scripts qui extrait des commandes dans des fichiers (et donx, comportant éventuellement des pipes), je me demandais ce qu'elle avait de non orthodoxe.

Après pour la question de réactiver un comportement inhibé, c'est pas faux encore que, je ne sais pas quelles raisons poussent le shell à inhiber le comportement du pipe... On peut aussi se demander en quoi c'est dangereux ou mal en dehors du fait que c'est algorithmiquement amoral/paradoxal.

En tout cas merci N_BaH pour l'explication.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 09h40   #12
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par Fanny28 Voir le message
Je n'ai pas donné trop de détails car je ne souhaitais pas que des gens perdent trop de temps à effectuer mon travail
C'est tout à ton honneur Tu peux toujours poster ta solution une fois prête si tu veux que l'on te propose quelque chose d'éventuellement plus adapté :p

Sinon, outre l'explication de N_BaH, l'utilisation d'eval est parfois déconseillée à cause des problèmes potentiels de sécurité que cela peut potentiellement poser.

Enfin, il y a également la possibilité d'utiliser 2 variables distinctes :
Code :
1
2
3
4
5
6
$ MON_LS="ls -l"
$ MON_CAT="tail -3"
$ $MON_LS | $MON_CAT
-rw-r--r--  1 user users       538 Mar  9 16:11 test_sort.xml
drwxr-xr-x  4 user users      4096 May  6 09:56 tmp
drwxr-xr-x  2 user users      4096 Feb 18 09:46 vpn
Avec toujours le risque d'avoir à utiliser xargs
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h31.


 
 
 
 
Partenaires

Hébergement Web