#1 Le 06/03/2020, à 14:01
- ar barzh paour
[Résolu] paramètre de commande
pourquoi ce bash ne fonctionne-t-il pas ?
autrement dit
comment faut-il coder pour avoir le résultat de dpkg -l|grep hplip dans la fonction ?
#!/bin/bash
function lance-commande {
echo "début de function"
echo $1
$($1)
echo "fin de fonction"
}
lance-commande "dpkg -l | grep hplip"
le résultat
jpb@jpb-MS-7A70:~$ bash ./l-c.sh
début de function
dpkg -l | grep hplip
dpkg-query: aucun paquet ne correspond à |
./l-c.sh: ligne 5: Souhait=inconnU/Installé/suppRimé/Purgé/H=à: Aucun fichier ou dossier de ce type
fin de function
jpb@jpb-MS-7A70:~$
Dernière modification par ar barzh paour (Le 07/03/2020, à 10:20)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 06/03/2020, à 14:10
- melixgaro
Re : [Résolu] paramètre de commande
desktop$ var="dpkg -l \| grep hplip"
desktop$ $var
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
dpkg-query: no packages found matching \|
+++-==============-=====================-============-============================================
ii grep 3.3-1build1 amd64 GNU grep, egrep and fgrep
ii hplip 3.19.6+dfsg0-1ubuntu1 amd64 HP Linux Printing and Imaging System (HPLIP)
ne pas mettre de " autour de $var
var contient la commande, suffit de l'appeler Modif : Non !
Dernière modification par melixgaro (Le 06/03/2020, à 16:07)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#3 Le 06/03/2020, à 14:13
- ar barzh paour
Re : [Résolu] paramètre de commande
#!/bin/bash
function lance-commande {
echo " début de function"
echo $1
$1
echo " fin de function"
}
lance-commande "dpkg -l | grep hplip"
oui j'avais essayé mais ce n'est pas bon
jpb@jpb-MS-7A70:~$ bash ./l-c.sh
début de function
dpkg -l | grep hplip
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
||/ Nom Version Architecture Description
+++-======================-================-================-==================================================
ii grep 3.1-2build1 amd64 GNU grep, egrep and fgrep
ii hplip 3.17.10+repack0- amd64 HP Linux Printing and Imaging System (HPLIP)
dpkg-query: aucun paquet ne correspond à |
fin de function
jpb@jpb-MS-7A70:~$
en fait j'ai essayé aussi $* $@ "$*" "$@"
Dernière modification par ar barzh paour (Le 06/03/2020, à 14:15)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#4 Le 06/03/2020, à 14:17
- melixgaro
Re : [Résolu] paramètre de commande
regarde bien ce que j'indique Modif : Non ! Regarde plutôt ce que kamaris propose
Dernière modification par melixgaro (Le 06/03/2020, à 16:07)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#5 Le 06/03/2020, à 15:18
- kamaris
Re : [Résolu] paramètre de commande
Le pipe « | » est considéré littéralement, à partir du moment où il a été passé comme argument à ta fonction.
Pour t'en convaincre, tu peux utiliser set -x :
set -x
$1
set +x
Tu vas avoir que ce que le shell exécute, c'est :
dpkg -l '|' grep hplip
Si tu veux qu'il interprète « | » comme un pipe, il faut que tu utilises eval :
eval "$1"
Hors ligne
#6 Le 06/03/2020, à 15:25
- melixgaro
Re : [Résolu] paramètre de commande
Ou échapper le pipe comme indiqué en 3. Modif : Non !
Dernière modification par melixgaro (Le 06/03/2020, à 16:08)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#7 Le 06/03/2020, à 15:31
- kamaris
Re : [Résolu] paramètre de commande
Non, ça ne fonctionnera pas mieux :
dpkg-query: no packages found matching \|
À partir du moment où il y a des choses à interpréter pour le shell, la mise en variables ne peut pas marcher directement : il faut passer par eval, ou bash -c, ou autre procédé du même type.
Hors ligne
#8 Le 06/03/2020, à 16:06
- melixgaro
Re : [Résolu] paramètre de commande
Ouh la il me faut des lunettes. Merci kamaris.
Je me suis fait totalement avoir car le message d'erreur n'apparaît pas au même endroit du retour entre deux lancements. Là j'ai refait la même chose qu'au 2 et le message est apparu en 1ère ligne.
Désolé !
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#9 Le 06/03/2020, à 16:42
- kamaris
Re : [Résolu] paramètre de commande
No problemo !
Hors ligne
#10 Le 06/03/2020, à 17:31
- Watael
Re : [Résolu] paramètre de commande
c'est quoi le gain de faire exécuter une commande passée en argument à une fonction, plutôt que d'exécuter la commande ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 06/03/2020, à 17:45
- ar barzh paour
Re : [Résolu] paramètre de commande
ok merci à tous , je crois que j'aurais cherché un moment avant d'utilise eval !!!!
#!/bin/bash
function lance-commande {
echo " début de function"
echo $1
#$(eval "$1")
eval "$1"
echo " fin de function"
}
lance-commande "dpkg -l | grep hplip"
jpb@jpb-MS-7A70:~$ bash ./l-c.sh
début de function
dpkg -l | grep hplip
ii hplip 3.17.10+repack0-5 amd64 HP Linux Printing and Imaging System (HPLIP)
ii hplip-data 3.17.10+repack0-5 all HP Linux Printing and Imaging - data files
fin de function
jpb@jpb-MS-7A70:~$
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#12 Le 06/03/2020, à 17:54
- ar barzh paour
Re : [Résolu] paramètre de commande
roll c'est quoi le gain de faire exécuter une commande passée en argument à une fonction, plutôt que d'exécuter la commande ?
je n'avais pas vu ta remarque
j'ai plusieurs commande à passer et je veux à chaque les faire précéder et suivre d'une marque comme j'ai mis "début de fonction" "fin de fonction"
#!/bin/bash
function lance-commande {
echo " début de function" >> "$fich"
echo $1 >> "$fich"
eval "$1" >> "$fich"
echo " fin de function" >> "$fich"
}
# un peu comme ça , je n'ai pas encore testé la syntaxe liste étant une liste de commandes
fich="/tmp/tmp.txt"
echo "" >"$fich"
for cmd in "$liste"
do
lance-commande "$cmd"
done
Dernière modification par ar barzh paour (Le 06/03/2020, à 17:59)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#13 Le 06/03/2020, à 18:24
- Watael
Re : [Résolu] paramètre de commande
je prendrais le problème dans l'autre sens :
$ echoUn() { echo "un";}
$ echoDeux() { echo "deux";}
$ echoTrois() { echo "trois";}
$ for i in echo{Un,Deux,Trois}; do echo "début $i"; $i; echo "fin $i"; done
début echoUn
un
fin echoUn
début echoDeux
deux
fin echoDeux
début echoTrois
trois
fin echoTrois
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 06/03/2020, à 21:08
- ar barzh paour
Re : [Résolu] paramètre de commande
@Watael
(je sais que je ne code pas corectement)
tu peux me donner ton avis sur
https://forum.ubuntu-fr.org/viewtopic.php?id=2047694
@kamaris
ça ne fonctionne pas pour cette commande alambiquée
find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; nl -ba "$1"' _ '{}' \;
(voir le lien ci-dessus
utilisation dans
function choixImp {
choix sS
normalement j'aurais du utiliser
cmd="find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; nl -ba "$1"' _ '{}' \;" ; l-c "$cmd"
mais ça ne marche pas , certainement le \n$1n et/ou le "$1" qui mettent le bazar
Dernière modification par ar barzh paour (Le 06/03/2020, à 21:15)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#15 Le 06/03/2020, à 22:00
- melixgaro
Re : [Résolu] paramètre de commande
Mais ce que tu veux faire n'est une bonne pratique !
Relis la signature de Watael
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#16 Le 06/03/2020, à 22:24
- Zakhar
Re : [Résolu] paramètre de commande
Tu sais qu'il y a aussi simplement sh -x qui va te faire tourner ton script en mode debug, c'est à dire afficher chaque ligne avant de l'exécuter, en montrant en plus les empilement de sub-process dus aux pipe et autres.
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#17 Le 06/03/2020, à 22:42
- Watael
Re : [Résolu] paramètre de commande
moi, j'enregistrerais le résultat des commandes en les concaténant dans une variable, ou un tableau, que j'afficherais après le case :
sep() { printf '=%.s' {1..80}; echo;}
case $(zenity ... ) in
[eE]) aAfficher=( "imprimante Espon" )
aAfficher+=( "$(dpkg -l | grep -i 'epson')" )
;;
[...]) aAfficher...
;;
esac
sep
printf '%s\n' "${aAfficher[@]}"
sep
KISS!!!*
--
* Keep It Simple Stupid!!!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 07/03/2020, à 01:37
- kamaris
Re : [Résolu] paramètre de commande
@kamaris
ça ne fonctionne pas pour cette commande alambiquéefind /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; nl -ba "$1"' _ '{}' \;
normalement j'aurais du utiliser
cmd="find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; nl -ba "$1"' _ '{}' \;" ; l-c "$cmd"
mais ça ne marche pas , certainement le \n$1n et/ou le "$1" qui mettent le bazar
Il faut que tu échappes les guillemets doubles lorsque tu veux les inclure dans des guillemets doubles englobants :
cmd="find /etc/apt -name '*.list' -exec bash -c 'echo -e \"\n$1\n\"; nl -ba \"$1\"' _ '{}' \;"
PS : ceci n'est pas un encouragement à faire du eval, simplement une réponse apportée à une question sur le bon usage des guillemets.
Hors ligne
#19 Le 07/03/2020, à 08:54
- Watael
Re : [Résolu] paramètre de commande
PS : ceci n'est pas un encouragement à faire du eval, simplement une réponse apportée à une question sur le bon usage des guillemets.
tu as raison. la chasse est ouverte; il fait bon porter une chasuble orange dans les bois.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 07/03/2020, à 10:02
- ar barzh paour
Re : [Résolu] paramètre de commande
@kamaris
ça ne fonctionne pas pour cette commande alambiquée
find /etc/apt -name '*.list' -exec bash -c 'echo -e "\n$1\n"; nl -ba "$1"' _ '{}' \;
au temps pour moi
j'ai bêtement appliqué la méthode pour des autres commandes , sans me poser de question
d'où l'oubli des \ devant les "
mais il a fallu que protège aussi $ pour que cela fonctionne ce qui donne
cmd="find /etc/apt -name '*.list' -exec bash -c 'echo -e \"\n\$1\n\"; nl -ba \"\$1\"' _ '{}' \;" ; l-c "$cmd"
vu le temps qui me reste je vois que je n'atteindrai jamais votre niveau !!!!!
je passe la discussion en Résolu
ce que j'espère en retenir ...
post #5 Kamaris
eval "$1"
(bien que "eval c'est mal")
post #18 Kamaris
penser aux caractères de protection
post #13 Watael
for i in echo{Un,Deux,Trois};
post #17 Watael
sep() { printf '=%.s' {1..80}; echo;}
aAfficher+=( "$(dpkg -l | grep -i 'epson')" )
printf
commande à la quelle je ne pense pas
post #16 Zakhar
sh -x
à essayer , je ne connais pas
etc etc
merci à tous
et pour faire le pendant à Watael , vu le temps , je vais m'occuper de mon jardin !!!
Dernière modification par ar barzh paour (Le 07/03/2020, à 20:45)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne