#1 Le 12/07/2016, à 09:50
- grigouille
[Résolu] shell : exécuter une variable avec redirection
Bonjour,
Je n'arrive pas à exécuter une variable qui contient une redirection. Si quelqu'un veut bien m'aider. Merci.
$ cat test.sh
#!/bin/bash
cmd="ls > u"
echo $cmd
$cmd
$ ./test.sh
ls > u
ls: impossible d'accéder à '>': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'u': Aucun fichier ou dossier de ce type
$ ls
a test.sh
$ bash -x test.sh
+ cmd='ls > u'
+ echo ls '>' u
ls > u
+ ls '>' u
ls: impossible d'accéder à '>': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'u': Aucun fichier ou dossier de ce type
$
On voit clairement que le caractère > est protégé dans la variable. Comment faire pour afficher cette commande et l'exécuter correctement ?
Dernière modification par grigouille (Le 13/07/2016, à 13:25)
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#2 Le 12/07/2016, à 10:17
- credenhill
Re : [Résolu] shell : exécuter une variable avec redirection
hello
essayer
bash -c "$cmd"
Hors ligne
#3 Le 12/07/2016, à 10:34
- bruno
Re : [Résolu] shell : exécuter une variable avec redirection
#!/bin/bash
cmd=`ls > u`
$cmd
#4 Le 12/07/2016, à 10:50
- MicP
Re : [Résolu] shell : exécuter une variable avec redirection
Bonjour
Tu peux aussi en faire un alias :
michel@debg53sw:~$ alias cmd='ls -l > fichierCree'
michel@debg53sw:~$ cmd
michel@debg53sw:~$ ls -l fichierCree
-rw-r--r-- 1 michel michel 11344 juil. 12 11:34 fichierCree
michel@debg53sw:~$
michel@debg53sw:~$ rm fichierCree; unalias cmd; # Supprime le fichier qui avait été créé et l'alias cmd.
ou en faire une fonction :
michel@debg53sw:~$ cmd(){ ls -l > fichierCree;}
michel@debg53sw:~$ cmd
michel@debg53sw:~$ ls -l fichierCree
-rw-r--r-- 1 michel michel 11344 juil. 12 11:44 fichierCree
michel@debg53sw:~$
michel@debg53sw:~$ rm fichierCree; unset cmd; # Supprime le fichier qui avait été créé et la fonction cmd.
Hors ligne
#5 Le 12/07/2016, à 10:52
- grigouille
Re : [Résolu] shell : exécuter une variable avec redirection
@bruno
Oui mais dans ce cas le "echo $cmd" ne donne rien.
Je souhaite voir la commande et ensuite l'exécuter.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#6 Le 12/07/2016, à 12:49
- Rufus T. Firefly
Re : [Résolu] shell : exécuter une variable avec redirection
#!/bin/bash cmd=`ls > u` $cmd
La dernière ligne est inutile, dans ce cas : les guillemets ` ` impliquent l'exécution du contenu... C'est d'ailleurs pour ça que echo $cmd ne renvoie rien qu'une chaîne vide (le retour de ls > u).
Preuve :
#!/bin/bash
cmd=`uname -a`
echo $cmd
Dernière modification par Rufus T. Firefly (Le 12/07/2016, à 12:55)
La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme
Hors ligne
#7 Le 12/07/2016, à 12:59
- lynn
Re : [Résolu] shell : exécuter une variable avec redirection
Je souhaite voir la commande et ensuite l'exécuter.
Je ne comprends pas ce que tu cherches à voir puisque ta commande ls > u envoie le résultat de ls dans ton fichier 'u'; Le echo sur la variable $cmd de cette commande ne renverra jamais rien... Non?
Un echo sur un truc comme ça
cmd=$(cat u <(ls))
te renverra le contenu de u mais je ne vois pas trop l'intérêt... Comme l'a écrit MicP, tu peux utiliser un alias ou même créer une fonction.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#8 Le 12/07/2016, à 13:17
- grigouille
Re : [Résolu] shell : exécuter une variable avec redirection
hello
essayerbash -c "$cmd"
Merci pour ton aide. Par contre, cela ne convient pas.
$ cmd="ls > u"
$ echo $cmd
ls > u
$ $cmd
ls: impossible d'accéder à '>': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'u': Aucun fichier ou dossier de ce type
$ bash -c $cmd
a test.sh
frederic@xubuntu-IMEDIA-D2600:~/tototest$ ls
a test.sh
Le fichier u n'a pas été créé.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#9 Le 12/07/2016, à 13:21
- erresse
Re : [Résolu] shell : exécuter une variable avec redirection
Peut-être veut-il afficher la commande avant de l'exécuter, pas afficher le résultat de la commande ?
Avec ce code, ça devrait le faire non ?
cmd="ls"
echo $cmd
(${cmd}) > u
Là tu dois obtenir un fichier "u" avec le résultat de la commande "ls".
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
En ligne
#10 Le 12/07/2016, à 13:37
- MicP
Re : [Résolu] shell : exécuter une variable avec redirection
…Le fichier u n'a pas été créé.…
Tu as juste oublié les guillemets qui entouraient la variable cmd
echo $cmd;
bash -c "$cmd";
Dernière modification par MicP (Le 12/07/2016, à 13:42)
Hors ligne
#11 Le 12/07/2016, à 13:39
- grigouille
Re : [Résolu] shell : exécuter une variable avec redirection
J'ai trouvé : il faut utiliser eval. Merci à tous.
$ rm u
$ cmd='ls > u'
$ echo $cmd
ls > u
$ eval $cmd
$ cat u
a
test.sh
u
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#12 Le 12/07/2016, à 13:45
- grigouille
Re : [Résolu] shell : exécuter une variable avec redirection
"grigouille" dans son message N°8 a écrit :…Le fichier u n'a pas été créé.…
Tu as juste oublié les guillemets qui entouraient la variable cmd
echo $cmd; bash -c "$cmd";
Tu as raison, cela fonctionne. Merci pour l'information.
$ rm u
$ echo $cmd
ls > u
$ bash -c "$cmd"
$ ls
a test test.c test.sh u
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#13 Le 12/07/2016, à 14:00
- Watael
Re : [Résolu] shell : exécuter une variable avec redirection
salut,
J'ai trouvé : il faut utiliser eval. Merci à tous.
de rien : eval c'est mal !
se servir d'une variable pour stocker une commande n'est pas une bonne idée; tu en apportes une nouvelle preuve.
utilise un alias, ou une fonction s'il est nécessaire de passer un/des argument(s).
Dernière modification par Watael (Le 12/07/2016, à 14:01)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 12/07/2016, à 14:12
- MicP
Re : [Résolu] shell : exécuter une variable avec redirection
Du coup, ce qui suit pourrait peut-être t'intéresser :
fichierSortie="u"
cmd="ls > $fichierSortie";
echo -e "${cmd}\n\nVoulez-vous exécuter la ligne de commandes ci-dessus ? [o/N]";
read -sn1;
case $REPLY in
[yYoO])
bash -c "$cmd";
;;
*)
echo "Abandon…";
;;
esac;
ls -l $fichierSortie # histoire de vérifier si le fichier a été créé
La commande read du bash créé la variable REPLY
en utilisant les options sn1 de read, read attendra qu'un seul caractère soit tapé (pas la peine de valider en appuyant sur Entrée)
La commande ne sera lancée que si l'on réponds en appuyant sur la touche y ou o (en minuscule comme majuscule).
=======
Mais comme le précise Watael : Ce serait tellement mieux d'utiliser un alias ou une fonction…
Pour visualiser une fonction, il y a la commande type :
michel@debg53sw:~/tst$ cmd(){ ls > u;};
michel@debg53sw:~/tst$ type cmd
cmd est une fonction
cmd ()
{
ls --color=auto > u
}
michel@debg53sw:~/tst$
Du coup, on peut même constater qu'un alias de la commande ls s'est automatiquement immiscé dans la fonction.
Cet alias est :
alias ls='ls --color=auto'
il provient de mon fichier ~/.bash_aliases
Dernière modification par MicP (Le 12/07/2016, à 14:38)
Hors ligne
#15 Le 12/07/2016, à 14:47
- grigouille
Re : [Résolu] shell : exécuter une variable avec redirection
ok ok eval c'est mal, je retiens.
Merci MicP pour ton script qui élève ma connaissance du bash.
Merci à tous.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#16 Le 12/07/2016, à 15:04
- MicP
Re : [Résolu] shell : exécuter une variable avec redirection
C'était avec plaisir, mais lis surtout les conseils des autres (dans ce fil) : Ils sont incontestablement beaucoup plus compétents que moi.
Hors ligne