Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/07/2016, à 10: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, à 14:25)


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#2 Le 12/07/2016, à 11:17

credenhill

Re : [Résolu] shell : exécuter une variable avec redirection

hello
essayer

bash -c "$cmd"

Hors ligne

#3 Le 12/07/2016, à 11:34

bruno

Re : [Résolu] shell : exécuter une variable avec redirection

#!/bin/bash
cmd=`ls > u`
$cmd

Hors ligne

#4 Le 12/07/2016, à 11: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, à 11: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, à 13:49

Rufus T. Firefly

Re : [Résolu] shell : exécuter une variable avec redirection

bruno a écrit :
#!/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, à 13: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, à 13:59

lynn

Re : [Résolu] shell : exécuter une variable avec redirection

grigouille a écrit :

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, à 14:17

grigouille

Re : [Résolu] shell : exécuter une variable avec redirection

credenhill a écrit :

hello
essayer

bash -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, à 14: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 résolu, 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.

Hors ligne

#10 Le 12/07/2016, à 14:37

MicP

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";

Dernière modification par MicP (Le 12/07/2016, à 14:42)

Hors ligne

#11 Le 12/07/2016, à 14: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, à 14:45

grigouille

Re : [Résolu] shell : exécuter une variable avec redirection

MicP a écrit :
"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, à 15: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, à 15:01)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 12/07/2016, à 15: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, à 15:38)

Hors ligne

#15 Le 12/07/2016, à 15: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, à 16: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