J'ai lu les pages de manuel sur écho et cela me dit que le paramètre -e permettra à un caractère échappé, tel qu'un n échappé pour une nouvelle ligne, d'avoir sa signification particulière. Quand je tape la commande
$ echo -e 'foo\nbar'
dans un shell bash interactif, j'obtiens le résultat attendu:
foo
bar
Mais lorsque j'utilise cette même commande (j'ai essayé ce caractère de commande comme caractère de test), je reçois le résultat suivant:
-e foo
bar
C'est comme si echo interprétait le -e en tant que paramètre (car la nouvelle ligne est toujours visible), mais il interprétait également le -e comme une chaîne à écho. Que se passe t-il ici? Comment puis-je empêcher le -e d'apparaître?
Vous devez utiliser #!/bin/bash
comme première ligne de votre script. Sinon, ou si vous utilisez #!/bin/sh
, le script sera exécuté par Bourne Shell et sa variable echo
ne reconnaît pas l'option -e
. En général, il est recommandé que tous les nouveaux scripts utilisent printf
au lieu de echo
si la portabilité est importante.
Dans Ubuntu, sh
est fourni par un lien symbolique vers /bin/dash
.
Différentes implémentations de echo
se comportent de manière gênante. Certains ne prennent pas d’options (c’est-à-dire qu’ils font simplement écho à -e
comme vous le décrivez) et interprètent automatiquement les séquences d’échappement dans leurs paramètres. Certains prennent des drapeaux et n'interprètent pas les échappées à moins de recevoir le drapeau -e
. Certains prennent des drapeaux et interprètent différentes séquences d'échappement en fonction de l'attribution ou non du drapeau -e
. Certains vont vous arracher les cheveux si vous essayez de les faire se comporter de manière prévisible ... oh, attendez, c'est tout.
Ce que vous voyez probablement ici est une différence entre la version de echo
intégrée à bash
et /bin/echo
ou peut-être par rapport à une autre version intégrée de Shell. Cela m’a un peu perturbé lorsque Mac OS X 10.5 a été livré avec une variable echo
intégrée à bash qui faisait écho aux drapeaux, contrairement à ce que tous mes scripts attendaient ...
Dans tous les cas, il existe une solution: utilisez plutôt printf
. Il interprète toujours les séquences d'échappement dans son premier argument (la chaîne de format). Le problème est qu’il n’ajoute pas automatiquement de saut de ligne (vous devez donc vous rappeler de le faire explicitement) et interprète également les séquences %
dans son premier argument (il s’agit, après tout, d’une chaîne de format). En règle générale, vous souhaitez placer tous les éléments de mise en forme dans la chaîne de format, puis les chaînes de variables dans le reste des arguments afin de pouvoir contrôler leur interprétation par le format %
que vous utilisez pour les interpoler dans la sortie. Quelques exemples:
printf "foo\nbar\n" # this does what you're trying to do in the example
printf "%s\n" "$var" # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var" # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
Utilisation
alias echo/usr/bin/echo
forcer 'echo' en invoquant les coreutils 'echo qui interprètent le paramètre' -e '.
Essaye ça:
import subprocess
def bash_command(cmd):
subprocess.Popen(['/bin/bash', '-c', cmd])
code="abcde"
// you can use echo options such as -e
bash_command('echo -e "'+code+'"')
Source: http://www.saltycrane.com/blog/2011/04/how-use-bash-Shell-python-subprocess-instead-binsh/