Utilisez printf
, non echo
.
Il existe plusieurs versions différentes de la commande echo
. Il y a /bin/echo
(qui peut ou peut ne pas être la version de GNU Coreutils, selon le système), et la commande echo
est intégrée dans la plupart des shells. Différentes versions ont différentes façons (ou pas du tout) de spécifier ou de désactiver les échappements pour les caractères de contrôle.
printf
, d'autre part, a beaucoup moins de variation. Il peut exister comme une commande, généralement /bin/printf
, et il est construit dans certains shells (bash et zsh l'ont, tcsh et ksh ne le font pas), mais les différentes versions sont beaucoup plus similaires les unes aux autres que les différentes versions de echo
. Et vous n'avez pas besoin de mémoriser les options de la ligne de commande (à quelques exceptions près, GNU Coreutils printf accepte --version
et --help
, et le bash printf intégré accepte -v var
pour stocker la sortie dans une variable).
Pour votre exemple:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Et maintenant il est temps pour moi d'admettre que echo
fonctionnera tout aussi bien pour l'exemple que vous vous posez au sujet; il vous suffit de mettre des guillemets doubles autour de l'argument:
echo "[$res]"
comme kmkaplan a écrit (deux et demi ans, je viens de remarquer!).Le problème avec vos commandes d'origine:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
est pas echo
; c'est que la coquille a remplacé la languette par un espace avant que le echo
ne l'ait jamais vu.
echo
est bien pour la sortie simple, comme echo hello world
, mais vous devez utiliser printf
lorsque vous voulez faire quelque chose de plus complexe. Vous peut obtenir echo
pour fonctionner, mais le code résultant est susceptible d'échouer lorsque vous exécutez avec une implémentation echo
différente ou un autre shell.
Merci Johannes. Vous m'avez aidé à trouver cette solution: res = '\ t \ t'x; echo -e '[' $ res ']' – kalyanji
Savez-vous pourquoi, echo -e' ne fonctionne pas depuis Makefiles? –
C'est parce que 'echo -e' n'est pas POSIX et' make' appelle '/ bin/sh' qui n'est normalement pas utilisé par le programme de manière interactive, et qui normalement n'a pas' -e' implémenté. Pour la portabilité, utilisez 'printf '\ t' à la place. –