[SHELL] Problème résultat d'une commande dans une variable

Bonjour,

Je rencontre actuellement en soucis pour mettre le résultat d’une commande dans une variable.
Mon but est de récupérer le résultat d’une commande (Asterisk) et de l’a mettre dans une variable pour ensuite compter le nombre de caractère que retourne la commande. Voici mon script :

[code]#!/bin/bash
PATH=/usr/sbin/asterisk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

testAsterisk=asterisk -rx 'test'
echo $testAsterisk
nombre=${#testAsterisk}
echo $nombre
[/code]

Je lance en mode test ma commande lorsque le service Asterisk est lancé et cela fonctionne :

bash -x check-nombres.sh

+ PATH=/usr/sbin/asterisk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
++ asterisk -rx test
+ testAsterisk='No such command '\''test'\'' (type '\''core show help test'\'' for other possible commands)'
+ echo No such command ''\''test'\''' '(type' ''\''core' show help 'test'\''' for other possible 'commands)'
No such command 'test' (type 'core show help test' for other possible commands)
+ nombre=79
+ echo 79
79[/code]

Lancement de la commande lorsqu' Asterisk est arrêté :

[code]bash -x check-nombres.sh

+ PATH=/usr/sbin/asterisk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
++ asterisk -rx test
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
+ testAsterisk=
+ echo

+ nombre=0
+ echo 0
0

Comme on peut le voir lorsqu’ Asterisk est démarré la commande suivante fonctionne :

Mais lorsqu’ Asterisk est arrété, il n’arrive pas à mettre le résultat dans la variable et exécute la commande directement ! Pourquoi ? Avez vous une idée ?

J’ai essayé également de l’écrire de cette manière mais cela ne fonctionne pas non plus :

J’ai essayé de lancé les commande une à une sans passer par le script, échec également !

Je précise que ce code à été testé sur un autre serveur et cela fonctionne ! Lorsque le service Asterisk est arrêté il me renvoie bien le nombre de caractère :

bash -x check-nombres.sh

+ PATH=/usr/sbin/asterisk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
++ asterisk -rx test
+ testAsterisk='Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)'
+ echo Unable to connect to remote asterisk '(does' /var/run/asterisk/asterisk.ctl 'exist?)'
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
+ nombre=81
+ echo 81
81

C’est pour ça que je ne comprend pas, ça me parait pas logique…
Avez vous une idée ?

Dans ton script tu initialises une variable testAsterisk2 pour utiliser ensuite la variable testAsterisk, est-ce une coquille de copier/coller ?
Si tu veux utiliser une variable de type “integer” dans un script autant la définir de la sorte :

PATH=/usr/sbin/asterisk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
declare -i nombre=0
testAsterisk=`asterisk -rx 'test'`
echo $testAsterisk
nombre=$testAsterisk
echo $nombre

Je ne connais pas cette notation : “#testAsterisk” c’est propre à ce logiciel ?

Merci pour votre réponse,

Oui désolé c’est un problème de copier/coller, je viens de rectifié.

La notion de #testAsterisk permet de compter le nombre de caractère contenu dans la variable.

Si je déclare ma variable :

Et que je fait un :

Cela me renvoie : No such command ‘test’ (type ‘core show help test’ for other possible commands)
Ensuite la variable suivante va compter le nombre de caractères contenu dans la variable $testAsterisk :

Si je fait un :

Cela me renvoie : 79

79 étant le nombre de caractères que contient la phrase suivante : No such command ‘test’ (type ‘core show help test’ for other possible commands)
Là ça veut dire que cela à fonctionné.

Mais lorsque je coupe le service Asterisk via un /etc/init.d/asterisk stop, si je lance la même chose il devrait me retourner dans la variable $testAsterisk cela :
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?) et donc 81 caratères dans la variable $nombre

Hors lorsque je fait un :

Il me renvoie rien !

Car il n’as pas réussi à rajouté dans la variable le contenue de la commande : asterisk -rx ‘test’

Si je lance la commande manuellement asterisk -rx ‘test’ il renvoie bien le message ci dessus (Unable to connect to remot…)

Qu’est ce qui pourrait l’empêcher de mettre le résultat de la commande dans la variable ? Sachant que cela ne fonctionne pas que quand Asterisk est arrété ! Et que cela fonctionne sur un autre serveur.

J’imagine du coup que cela doit surement venir de la configuration du serveur mais je vois pas qu’est ce qui pourrais provoqué ça…

Apparemment il essaye d’interpréter ‘test’ essaye avec :

testAsterisk=`asterisk -rx "test"`

Toujours pareil, il ne me renvoie rien dans $testAsterisk et 0 dans $nombre

salut,

les avertissements et les messages d’erreurs semblent ne pas être envoyés sur la même sortie par asterisk : le message d’erreur (unable to connect…) est envoyé sur stderr, et donc n’apparaîtra pas dans la variable, qui ne “lit” que sur stdin; alors que l’avertissement (no such command…) est envoyé sur stdin.

àmha, les différences observées d’une machine à l’autre pourrait être expliquées par des versions d’asterisk différentes. à confirmer…

L’affectation des variables en Bash se fait effectivement par lecture sur l’entrée standard. Si tu veux assigner un potentiel message d’erreur à ta variable, il suffit de rediriger stderr vers stdout :

Merci à vous, cela à effectivement résolu mon problème.

En effet mes 2 serveurs n’avait pas exactement la même version d’Asterisk, du coup oui cela peut expliquer les différences…