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 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 :

melixgaro a écrit :
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 ! wink

Hors ligne

#10 Le 06/03/2020, à 17:31

Watael

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 ?


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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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

Watael a écrit :

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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 wink


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

ar barzh paour a écrit :

@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"' _ '{}' \; 

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. lol


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

Moi a écrit :

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

lol lol vu le temps qui me reste je vois que je n'atteindrai jamais votre niveau !!!!! lol lol

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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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