Qu'est-ce que cela signifie d'avoir une «chaîne préfixée en dollars» dans un script?

81

Je viens de voir cela dans un script init:

echo $"Stopping Apache"

A quoi sert ce signe dollar?

Mes recherches jusqu'à présent:

J'ai trouvé ceci dans le manuel bash:

citation

Si elle est définie, $'string'et $"string"citant est effectué dans les ${parameter}extensions entre guillemets. Cette option est activée par défaut.

... mais je ne trouve aucune différence entre les chaînes avec et sans le $préfixe:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD
Ed Brannin
la source

Réponses:

111

Il y a deux choses différentes qui se passent ici, les deux sont documentées dans le bashmanuel

$ '

La citation simple dollar-sign est une forme spéciale de citation:

Citations ANSI C

Les mots de la forme $ 'chaîne' sont traités spécialement. Le mot se développe en chaîne, avec les caractères d'échappement avec une barre oblique inversée remplacés comme spécifié par la norme ANSI C.

$ "

La double guillemet dollar-sign est pour la localisation:

Traduction locale

Une chaîne entre guillemets précédée d'un signe dollar ('$') entraînera la traduction de la chaîne en fonction de la locale. Si les paramètres régionaux actuels sont C ou POSIX, le signe dollar est ignoré. Si la chaîne est traduite et remplacée, le remplacement est cité en double.

jw013
la source
22

Lorsqu'une chaîne est développée à l'intérieur de $'', les séquences d'échappement sont interprétées. De la page de manuel:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

Un exemple simple est la séquence d'échappement \ n pour une nouvelle ligne:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Remarque: Vous pouvez obtenir des résultats différents dans d'autres shells, car echovous pouvez interpréter les séquences d'échappement sans fournir d'options.

Jordan
la source
8
Il n'y a aucune mention de $"...", selon la question.
Peter.O
-4

Vous interprétez mal le manuel. Vous ne verrez un effet que lorsqu'une chaîne $ -cotée est à l' intérieur d' une ${parameter}extension.

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

Source et lectures supplémentaires: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
la source
6
Cela ne répond pas à la question: $"…"est quelque chose de différent.
Gilles
4
Désolé, votre réponse est fausse: il n'est pas nécessaire d'utiliser l' ${}extension pour utiliser la citation ANSI. Vérifiez par vous-même:echo $'ab\ncd'
rozcietrzewiacz
1
Je pense que cette réponse essayait d'expliquer de extquotemanière incorrecte au lieu de ce que la question demandait.
jw013
1
"${...}"est différent de$"..."
GypsyCosmonaut