¿Qué significa tener una "cadena prefijada con signo de dólares" en un script?

81

Acabo de ver esto en un guión de inicio:

echo $"Stopping Apache"

¿Para qué es ese signo de dólar?

Mi investigación hasta ahora:

Encontré esto en el manual de bash:

extquote

Si se establece, $'string'y las comillas $"string"se realizan dentro de las ${parameter}expansiones entre comillas dobles. Esta opción está activada de forma predeterminada.

... pero no encuentro ninguna diferencia entre cadenas con y sin el $prefijo:

$ 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
fuente

Respuestas:

111

Aquí hay dos cosas diferentes, ambas documentadas en el bashmanual.

PS

La cotización simple con signo de dólar es una forma especial de cotización:

Cita ANSI C

Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a cadena, con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.

PS

La doble comilla del signo de dólar es para localización:

Traducción local

Una cadena entre comillas dobles precedida por un signo de dólar ('$') hará que la cadena se traduzca de acuerdo con la configuración regional actual. Si el entorno local actual es C o POSIX, se ignora el signo de dólar. Si la cadena se traduce y reemplaza, el reemplazo se cita entre comillas.

jw013
fuente
22

Cuando una cadena se expande dentro de $'', las secuencias de escape se interpretan. Desde la página del manual:

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 ejemplo sencillo es la secuencia de escape \ n para una nueva línea:

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

$ 

Nota: Puede obtener resultados diferentes en otros shells que echopueden interpretar secuencias de escape sin proporcionar opciones.

jordanm
fuente
8
No se menciona $"...", según la pregunta.
Peter.O
-4

Estás malinterpretando el manual. Solo verá un efecto cuando una cadena entre comillas $ esté dentro de una ${parameter}expansión.

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

Fuente y lectura posterior: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
fuente
66
Esto no responde la pregunta: $"…"es algo diferente.
Gilles
44
Lo sentimos, pero su respuesta es incorrecta: no es necesario usar la ${}expansión para hacer uso de las citas ANSI. Compruébelo usted mismo:echo $'ab\ncd'
rozcietrzewiacz
1
Creo que esta respuesta estaba tratando de explicar extquoteincorrectamente en lugar de lo que estaba haciendo la pregunta.
jw013
1
"${...}"es diferente a$"..."
GypsyCosmonaut