web-dev-qa-db-fra.com

echo affiche le paramètre -e dans les scripts bash. Comment puis-je empêcher cela?

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.

32
Dennis Williamson

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
3
Gordon Davisson

Utilisation

alias echo/usr/bin/echo

forcer 'echo' en invoquant les coreutils 'echo qui interprètent le paramètre' -e '.

1
Huang F. Lei

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/

0
Sarvar Nishonboev