Aller au contenu

[BASH] Execution d'une commande dans une variable


ephaestos

Messages recommandés

Bonjour à tous.

Je rencontre un problème avec une fonction BASH dont voici le code :

function dateformat {

typeset -i RESULT=255

FORMAT=${1:-''}

COMMAND="/usr/local/bin/date +$FORMAT"
THE_DATE=`$COMMAND`
RESULT=${?}

if [[ ${RESULT} -ne 0 ]]; then

	echo -e "In file ${BASH_SOURCE} at line ${LINENO}: Failed to format date using command '${COMMAND}'."

else

	echo "${THE_DATE}"

fi

return ${RESULT}

}

J'exécute ensuite la fonction via ces deux lignes :

dateformat '%Y'

dateformat '%Y %d'

Dans le 1er cas, ca fonctionne correctement. Par contre dans le 2ème cas, le %d après l'espace est interpréré comme étant un second argument...

J'ai également testé avec l'appel suivant :

dateformat "'%Y %d'"

Sans succès... Y-a-t'il quelq'un pour m'aider ?

Merci bien :keskidit:

Lien vers le commentaire
Partager sur d’autres sites

Et si tu utilises dans ton script $@ ou $* ca n'irait pas mieux?

J'avoue que je ne sais plus lequel est celui qui donne tous les arguments mais je crois que c'est $*

Merci, je vais tester.

La différence entre $@ et $* est subtile : Si tu fait "$*" tu as une string contenant tous les parametres d'une fonction (ou d'un script), espacée du premier caractère de la variable d'environement $IFS et entourée du caractère ". Tandis que "$@" te donne n strings entourées du caractère ", avec n étant le nombre de paramètres de la fonction / script.

Lien vers le commentaire
Partager sur d’autres sites

Arf, ça ne fonctionne pas mieux. Vois les traces de debug :

+ DATE=/usr/local/bin/date
+ dateformat '%Y %d'
+ typeset -i RESULT=255
+ FORMAT='%Y %d'
+ COMMAND='/usr/local/bin/date +%Y %d'
++ /usr/local/bin/date +%Y %d
/usr/local/bin/date: extra operand `%d'
Try `/usr/local/bin/date --help' for more information.
+ THE_DATE=
+ RESULT=1
+ [[ 1 -ne 0 ]]
+ echo 'In file ./main.bash at line 42: Failed to format date using command '\''/usr/local/bin/date +%Y %d'\''.'
In file ./main.bash at line 42: Failed to format date using command '/usr/local/bin/date +%Y %d'.
+ return 1
+ exit

Celle là c'est quand j'appelle la fonction avec le parametre '%Y %d'

+ DATE=/usr/local/bin/date
+ dateformat ''\''%Y %d'\'''
+ typeset -i RESULT=255
+ FORMAT=''\''%Y %d'\'''
+ COMMAND='/usr/local/bin/date +'\''%Y %d'\'''
++ /usr/local/bin/date '+'\''%Y' '%d'\'''
/usr/local/bin/date: extra operand `%d\''
Try `/usr/local/bin/date --help' for more information.
+ THE_DATE=
+ RESULT=1
+ [[ 1 -ne 0 ]]
+ echo 'In file ./main.bash at line 42: Failed to format date using command '\''/usr/local/bin/date +'\''%Y %d'\'''\''.'
In file ./main.bash at line 42: Failed to format date using command '/usr/local/bin/date +'%Y %d''.
+ return 1
+ exit

Et là c'est quand j'appelle la fonction avec le parametre "'%Y %d'"

En fait dans le premier cas, on vois bien que l'espace du paramètres est interprété comme un second paramètre. Et dans le 2ème cas, les ' utilisées pour regrouper les deux parties du paramètre sont "echapées" donc non interprétées. Vraiment étrange...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous.

Je rencontre un problème avec une fonction BASH dont voici le code :

	FORMAT=${1:-''}

COMMAND="/usr/local/bin/date +$FORMAT"
THE_DATE=`$COMMAND`

Ça fonctionne en remplaçant par ça :

  RESULT=`/usr/local/bin/date +"$1"`

Pourquoi, je n'en sais rien exactement. Possible que ce soit à cause des imbrications de quotes.

++ /bin/date '+%Y %d'
++ /bin/date '+"%Y' '%d"'

On voit bien la différence.

Hors sujet : Tu l'as recompilé ton date ?

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse.

En fait je souhaite avoir une variable pour stocker une commande pour pouvoir soit l'afficher, soit l'exécuter. Je souhaite utiliser une variable afin d'eviter d'avoir deux fois la commande car ça veux dire pense à modifier les deux endrois lors d'une mise à jour -> 99% de chance d'oublier...

Note: Je n'ai pas recompilé date, je travaille sous Solaris 8 sur lequel est installé les outils GNU dans /usr/local/bin en plus des outils POSIX Unix dans /usr/xpg4/bin. Comme je souhaite assurer la portabiliter vers Linux j'utilise les outils GNU (qui offrent par ailleurs bien plus de possibilitées)

Lien vers le commentaire
Partager sur d’autres sites

J'ai trouvés un moyen de contournement. C'est pas très joli, mais ça fonctionne.

En fait je replace les espaces du format de la date par l'equivalent en héxa. Cette valeur n'est ensuite interprétée que par la commande echo et pas par par la commande date.

dateformat '%Y\x20%d'

PS: Bien sûr il ne faut pas non plus oublier de spécifier le paramètre -e à la commande echo, sinon le caractère l'echapement \x n'est pas interprété...

Lien vers le commentaire
Partager sur d’autres sites

Note: Je n'ai pas recompilé date, je travaille sous Solaris 8 sur lequel est installé les outils GNU dans /usr/local/bin en plus des outils POSIX Unix dans /usr/xpg4/bin. Comme je souhaite assurer la portabiliter vers Linux j'utilise les outils GNU (qui offrent par ailleurs bien plus de possibilitées)
Tu m'étonnes...

Plus il y a de gnu, moins on est emmerdé :yes:

Moi aussi je met plein de gnu sur les solaris :smack:

J'ai trouvés un moyen de contournement. C'est pas très joli, mais ça fonctionne.

En fait je replace les espaces du format de la date par l'equivalent en héxa. Cette valeur n'est ensuite interprétée que par la commande echo et pas par par la commande date.

dateformat '%Y\x20%d'

PS: Bien sûr il ne faut pas non plus oublier de spécifier le paramètre -e à la commande echo, sinon le caractère l'echapement \x n'est pas interprété...

Pas bête.

Dans ce cas puis-je te suggérer un

FORMAT=$(echo ${1:-''} | sed 's/ /\\x20/g')

Histoire de ne pas avoir à le faire pour chaque appel.

EDIT : copier coller.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...