Bash - executer deux commandes assignées à une variable

Résolu/Fermé
publiphobe - Modifié le 17 oct. 2022 à 08:24
 publiphobe - 18 oct. 2022 à 18:10

Bonjour,

J'aimerais comprendre pourquoi je ne peux pas executer en bash deux commandes assignées à une même variable via la fonction read.

Voici le code:

root@family:~# read -ep "command: " cmd ; "$cmd"

et le résultat:

command: id ; date
-bash: id ; date : commande introuvable

Merci beaucoup pour votre aide,

5 réponses

mamiemando Messages postés 32782 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 novembre 2023 7 685
Modifié le 17 oct. 2022 à 16:17

Bonjour,

Car il faut utiliser eval, car sinon tout se passe comme si les espaces étaient échappés. et si la commande s'appelait "id ; date" au lieu d'interpréter "id", puis "date".

read -ep "command: " cmd ; eval "$cmd"
command: id; date
uid=1000(mando) gid=1000(mando) groupes=1000(mando),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),101(input),108(netdev),110(lpadmin),113(scanner),119(bluetooth),136
(wireshark)
lun. 17 oct. 2022 16:15:40 CEST

Bonne chance

1

super, merci beaucoup !

0
dubcek Messages postés 18676 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 29 novembre 2023 5 598
17 oct. 2022 à 17:04

hello

ou

$ read -ep "command: " cmd ; bash -c "$cmd"
command: uname;date
Linux
Mon Oct 17 17:01:56 CEST 2022
1

Effectivement, ça fonctionne, merci !

Est-ce que tu crois qu'il est possible dans ces conditions, d'exécuter la deuxième commande uniquement si la première est valide ?

Je connais $?, mais je ne pense pas qu'on puisse l'exploiter dans ce contexte précis.

0
mamiemando Messages postés 32782 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 novembre 2023 7 685
18 oct. 2022 à 17:32

Bonjour,

Est-ce que tu crois qu'il est possible dans ces conditions, d'exécuter la deuxième commande uniquement si la première est valide ?

Je connais $?, mais je ne pense pas qu'on puisse l'exploiter dans ce contexte précis.

Une autre manière de reformuler ce que dubcek a déjà indiqué dans #5 :

Oui c'est possible, c'est la nuance entre :

cmd1 && cmd2 #cmd2 ne s'exécute que si cmd1 a fonctionné

 ... et :

cmd1 ; cmd2 #cmd2 ne s'exécute même si cmd1 n'a pas fonctionné

Comme dubcek l'indique, c'est en rapport direct avec la variable $?, (qui stocke le code d'exécution de la commande invoquée). En effet, c'est grâce au code d'exécution que l'opérateur && détermine s'il va exécuter ou non la seconde commande (s'il est nul, alors la commande s'est bien exécutée, sinon, c'est qu'il y a eu une erreur).

Au niveau de ton script, tu peux contrôler avec un if ce que contient $?. Cela permet de rattraper différemment une erreur en fonction de l'entier ainsi récupéré (et les codes d'exécutions des différentes commandes sont documentées dans leur page de man). Après, dans ton cas particulier, l'opérateur && est probablement suffisant.

Bonne chance

1
dubcek Messages postés 18676 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 29 novembre 2023 5 598
Modifié le 18 oct. 2022 à 17:23

date n'est exécuté que si ls retourne $?==0

$ ls yxc
ls: cannot access 'yxc': No such file or directory
$
$ read -ep "command: " cmd ; bash -c "$cmd"
command: ls yxc && date
ls: cannot access 'yxc': No such file or directory
$ 
$ touch yxc
$ read -ep "command: " cmd ; bash -c "$cmd"
command: ls yxc && date
yxc
Tue Oct 18 10:32:53 CEST 2022
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Bonjour,

Merci beaucoup pour ta réponse. En fait, je ne voulais pas pas qu'il y ait des deux variables différentes, donc en fait une seule execution avec eval $cmd.

Du coup ce que j'ai fait, c'est mettre un set -e

Merci encore pour vos réponses, passez une très bonne soirée.

0