Récupérer le quoting des arguments
Bonjour, Encore moi ;-) Comment récupérer dans un script bash l'argument --arg="foo bar" avec ses " ? function foo() { for arg in $@; do echo $arg; done; } function bar() { echo $*; } $> foo toto titi="tutu tata" toto titi=tutu tata $> bar toto titi="tutu tata" toto titi=tutu tata Y'a pas moyen de récupérer les " ? J'ai fouillé un peu (man bash compris) mais pas l'impression que ce soit possible. J'ai bien des workaround en réécrivant autrement l'appel, mais je suis pas maître de l'appelant ni de l'environnement, c'est pour que mon script du post précédent fonctionne avec un appel comme benice_rsync … --rsh='/usr/bin/ssh -i /path/to/id_rsa' … pour lancer en arrière plan rsync … --rsh='/usr/bin/ssh -i /path/to/id_rsa' … Et avec zsh c'est possible ? Merci -- Daniel L'homme est un être raisonnable, mais les hommes le sont-ils ? Raymond Aron (Dimensions de la conscience historique)
On Mon, Dec 07, 2015 at 12:28:38PM +0100, Daniel Caillibaud wrote:
Bonjour,
Et avec zsh c'est possible ?
dans zsh tu peux "surquoter" pour obtenir ca for e ( this is a test ) print ${(qq)e} 'this' 'is' 'a' 'test' dans man ksh, je trouve ${name@Q} bash ... c'est quoi bash ?
function foo() { for arg in $@; do echo $arg; done; } function bar() { echo $*; }
au passage: fais attention $@ expand sans quotes et $@ expand avec. donc foo=( "this" "" "is" "it") print -l $foo this is it print -l "${(@)foo}" this is it en fait ca serait cool que tu expliques ce que tu veux faire parceque d'autres astuces sont possibles. par exemple: quand je veux executer qqchose sur une machine distante, je pipe plutot que je ne quote. ssh machine ls peut aussi s'écrire ssh machine zsh <<< ls du coup tu récupères tout ce qui est dispo avec les redirections (heredocs...) cordialement, -- Marc Chantreux (eiro on github and freenode) http://eiro.github.com/ http://eiro.github.com/atom.xml "Don't believe everything you read on the Internet" -- Abraham Lincoln
Le 07/12/15 à 14:56, Marc Chantreux <khatar@phear.org> a écrit : MC> On Mon, Dec 07, 2015 at 12:28:38PM +0100, Daniel Caillibaud wrote: MC> > Bonjour, MC> > MC> > Et avec zsh c'est possible ? MC> MC> dans zsh tu peux "surquoter" pour obtenir ca MC> MC> for e ( this is a test ) MC> print ${(qq)e} MC> MC> 'this' MC> 'is' MC> 'a' MC> 'test' MC> MC> dans man ksh, je trouve MC> MC> ${name@Q} Sauf que je ne veux pas en ajouter partout, juste récupérer la ligne d'arguments telle qu'elle a été transmise. MC> en fait ca serait cool que tu expliques ce que tu veux faire Ben, justement, c'était dans mon post : DC> c'est pour que mon script du post précédent fonctionne DC> avec un appel comme DC> benice_rsync … --rsh='/usr/bin/ssh -i /path/to/id_rsa' … DC> pour lancer en arrière plan DC> rsync … --rsh='/usr/bin/ssh -i /path/to/id_rsa' … Mais je ne veux pas quoter tous les arguments, juste récupérer les quotes telles qu'elles étaient dans la ligne de commande initiale, car si je récupère bien un seul argument (sans les quotes) --rsh=/usr/bin/ssh -i /path/to/id_rsa le passer à rsync avec rsync "--rsh=/usr/bin/ssh -i /path/to/id_rsa" ne va pas donner l'effet escompté J'ai des solutions de contournement, par ex via .ssh/config, ou en ajoutant des quotes après le = et à la fin si j'ai un égal et une espace dans mon argument, mais ça fait bricolage, je voulais savoir si y'avait moyen de récupérer la ligne de commande intégralement et sans altération du quoting. -- Daniel Un pigeon, c'est plus con qu'un dauphin, d'accord... mais ça vole. Michel Audiard
On Mon, Dec 07, 2015 at 03:32:32PM +0100, Daniel Caillibaud wrote:
Mais je ne veux pas quoter tous les arguments, juste récupérer les quotes telles qu'elles étaient dans la ligne de commande initiale, car si je récupère bien un seul argument (sans les quotes) --rsh=/usr/bin/ssh -i /path/to/id_rsa le passer à rsync avec rsync "--rsh=/usr/bin/ssh -i /path/to/id_rsa" ne va pas donner l'effet escompté
... pourquoi ca ? les quotes ne sont la que pour délimiter une zone ou tu n'as pas besoin de proteger individuellement les chars (il faut se rappeller que l'expansion est faite *avant* execution) donc pour ton shell, toutes ces chaines sont identiques: --rsh='/usr/bin/ssh -i /path/to/id_rsa' '--rsh=/usr/bin/ssh -i /path/to/id_rsa' --rsh=/usr/bin/ssh' -i /path/to/id_rsa' --rsh=/usr/bin/ssh\ -i '/path/to/id_rsa' du coup je suis pas sur de comprendre ta question: pourrais-tu tenter d'écrire un cas simple d'un truc qui foire a tes yeux? (si tu utilisais uze, je te proposerais bien d'écrire un test...) -- Marc Chantreux (eiro on github and freenode) http://eiro.github.com/ http://eiro.github.com/atom.xml "Don't believe everything you read on the Internet" -- Abraham Lincoln
Le 07/12/15 à 16:16, Marc Chantreux <khatar@phear.org> a écrit : MC> On Mon, Dec 07, 2015 at 03:32:32PM +0100, Daniel Caillibaud wrote: MC> > Mais je ne veux pas quoter tous les arguments, juste récupérer les quotes telles qu'elles MC> > étaient dans la ligne de commande initiale, car si je récupère bien un seul MC> > argument (sans les quotes) MC> > --rsh=/usr/bin/ssh -i /path/to/id_rsa MC> > le passer à rsync avec MC> > rsync "--rsh=/usr/bin/ssh -i /path/to/id_rsa" MC> > ne va pas donner l'effet escompté MC> MC> ... MC> MC> pourquoi ca ? les quotes ne sont la que pour délimiter une zone ou tu MC> n'as pas besoin de proteger individuellement les chars (il faut se MC> rappeller que l'expansion est faite *avant* execution) Tu as raison, j'ai encore écrit une ânerie. MC> donc pour ton shell, toutes ces chaines sont identiques: MC> MC> --rsh='/usr/bin/ssh -i /path/to/id_rsa' MC> '--rsh=/usr/bin/ssh -i /path/to/id_rsa' MC> --rsh=/usr/bin/ssh' -i /path/to/id_rsa' MC> --rsh=/usr/bin/ssh\ -i '/path/to/id_rsa' MC> MC> du coup je suis pas sur de comprendre ta question: Je me demandais juste si y'avait un ${truc} pour récupérer la commande complète "telle quelle", éventuellement avec un autre shell que bash. MC> pourrais-tu tenter d'écrire un cas simple d'un truc qui foire a tes MC> yeux? (si tu utilisais uze, je te proposerais bien d'écrire un test...) J'essayais justement de formuler la question pour sortir de mon petit problème ponctuel. La question n'était pas tant de le résoudre que d'apprendre un truc sur le shell, qui est davantage l'objet de la liste ;-) Mais puisque tu insiste, voici le cas qui foire et m'amènenait à la question : (dans benice.sh, qui a des alias en symlinks benice_cp, benice_rm, benice_rsync, …) me=$(basename $0) [ "$me" == "benice.sh" ] && commande="$@" || commande="${me#*benice_} $@" $commande && … mais si je le réécris avec [ "$me" == "benice.sh" ] && commande="" || commande="${me#*benice_}" $commande $@ && … ça devrait régler ce problème. -- Daniel Apprendre a mourir ! Et pourquoi donc ? On y réussit très bien la première fois ! Chamfort
Je me demandais juste si y'avait un ${truc} pour récupérer la commande complète "telle quelle",
non mais justement: "telle quel" c'est ce qui résulte de l'interpolation donc il n'y a plus les quotes. vois ta chaine finale comme un graphiti et les quotes et autres symboles spéciaux comme un pochoir. le pochoir n'est plus là une fois la chaine construite.
me=$(basename $0) [ "$me" == "benice.sh" ] && commande="$@" || commande="${me#*benice_} $@"
ok ... donc ce que tu veux dire c'est que tu construis une chaine qui contient ta commande et que tu aimerais évaluer tel quel: eval "$commande" au passage commande="$@" est étrange: tu prends un tableau pour le mettre dans une chaine commande="$*" me parrait plus indiqué cordialement, -- Marc Chantreux (eiro on github and freenode) http://eiro.github.com/ http://eiro.github.com/atom.xml "Don't believe everything you read on the Internet" -- Abraham Lincoln
participants (2)
-
Daniel Caillibaud
-
Marc Chantreux