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
- eest 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 -efera que echo interprète-ecomme un drapeau et affichera une nouvelle ligne vide. Pour imprimer-evous devez essentiellement utiliserprintf(ou vous pouvez utiliser une implémentation deechoqui permettra de faire cela). Je ne pense pas qu'il soit possible d'imprimer uniquement-eavec bash echo intégré.
printfest plus portable. Il existe des implémentations deechoqui ne prennent pas l'argument-eet 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 pasechomais imprime le résultat souhaité.