Comment puis-je faire écho
la chaîne littérale -e
et rien d'autre?
J'essaie de mieux comprendre comment les arguments du shell sont échappés.
Les commandes suivantes ne fonctionnent pas:
echo -e # prints nothing echo '-e' # prints nothing echo "-e" # prints nothing echo \-e # prints nothing echo \\-e # prints \-e echo '\-e' # prints \-e echo "'-e'" # prints '-e' (with quotes) echo -- -e # prints -- -e
Je n'en trouve pas une qui n'inclut ni guillemets ni barre oblique.
p >
4 Réponses :
Comment faire écho à la chaîne littérale "-e" (et rien d'autre) dans bash?
printf '%s\n' '-e' printf -- '-e\n'De man echo
- e
est une option:-e
activer l'interprétation des échappements anti-slashDepuis bash builtins :
écho ...
Si l'option -e est donnée, l'interprétation des caractères d'échappement par barre oblique inverse suivants est activée.
...
echo n'interprète pas - signifie la fin des options.Donc,
echo -e
fera que echo interprète-e
comme un drapeau et affichera une nouvelle ligne vide. Pour imprimer-e
vous devez essentiellement utiliserprintf
(ou vous pouvez utiliser une implémentation deecho
qui permettra de faire cela). Je ne pense pas qu'il soit possible d'imprimer uniquement-e
avec bash echo intégré.
printf
est plus portable. Il existe des implémentations deecho
qui ne prennent pas l'argument-e
et cela peut fonctionner. Sur le net, vous pouvez trouver divers sites sur les problèmes de portabilité des échos .
echo -e '\x2de' Not very readable, but it works
Une autre façon, en utilisant awk
et une chaîne de style Bash C et une "chaîne ici":
$ awk '1' <<< -e -e
Fonctionne sans guillemets (si tel est votre objectif):
$ awk '1' <<< $'-e' -e
Je suppose que la vraie question est de savoir pourquoi:
La fonction AC # ou Java ne peut jamais se comporter différemment selon que vous l'avez appelée comme foo (4)
ou foo (2 +2)
ou foo ((int) 16/4)
car cette information a disparu au moment où la fonction s'exécute. Il peut dire ce que vous avez transmis, mais il ne peut pas dire comment vous l'avez passé.
Pour la même raison, une commande ne peut jamais se comporter différemment basé sur si ou comment vous avez échappé à ses arguments. Les guillemets et les échappements sont un comment , tandis que l'argument de chaîne résultant est le what.
Voici l'appel équivalent à execlp
de chacune de vos tentatives ( echo
est intégré à bash mais se comporte de la même manière):
# v-- How you passed it v-- What you passed echo -e # execlp("echo", "echo", "-e", 0); # prints nothing echo '-e' # execlp("echo", "echo", "-e", 0); # prints nothing echo "-e" # execlp("echo", "echo", "-e", 0); # prints nothing echo \-e # execlp("echo", "echo", "-e", 0); # prints nothing echo \\-e # execlp("echo", "echo", "\\-e", 0); # prints \-e echo '\-e' # execlp("echo", "echo", "\\-e", 0); # prints \-e echo "'-e'" # execlp("echo", "echo", "'-e'", 0); # prints '-e' (with quotes) echo -- -e # execlp("echo", "echo", "--", "-e", 0); # prints -- -e
Comme vous pouvez le voir, le comment n'affecte pas du tout la sortie. Tout se résume au quoi . C'est pourquoi toutes les évasions du monde n'auront pas l'effet escompté.
Ça a du sens. Je suppose que je n'ai pas vraiment réfléchi à ce que echo
recevait :-) Dans ce cas, je suppose que echo
ne met tout simplement pas en œuvre un moyen pour échapper aux drapeaux potentiels , alors que d'autres applications prennent en charge manuellement -
pour de tels scénarios?
Exactement. Il ne peut pas vraiment utiliser les conventions normales car POSIX l'interdit pour des raisons historiques, et à cause de cela et d'autres problèmes de portabilité historiques, il recommande plutôt printf
printf '% s \ n' -e
? Il n'utilise pasecho
mais imprime le résultat souhaité.