4
votes

Comment faire écho à la chaîne littérale "-e" (et rien d'autre) dans bash?

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 >


1 commentaires

printf '% s \ n' -e ? Il n'utilise pas echo mais imprime le résultat souhaité.


4 Réponses :


5
votes

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-slash

Depuis 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 utiliser printf (ou vous pouvez utiliser une implémentation de echo 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 de echo 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 .


0 commentaires

3
votes
 echo -e '\x2de'
Not very readable, but it works

0 commentaires

0
votes

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


0 commentaires

3
votes

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é.


2 commentaires

Ç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