Bash - executer deux commandes assignées à une variable
Résolupubliphobe -
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,
- Bash - executer deux commandes assignées à une variable
- Invite de commandes - Guide
- Deux ecran pc - Guide
- Commandes terminal mac - Guide
- Comment faire deux colonnes sur word - Guide
- Nombre de jours entre deux dates excel - Guide
5 réponses
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
hello
ou
$ read -ep "command: " cmd ; bash -c "$cmd" command: uname;date Linux Mon Oct 17 17:01:56 CEST 2022
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
super, merci beaucoup !