O que significa ter uma string $ "dollarsign-prefixed" em um script?

71

Acabei de ver isso em um script de inicialização:

echo $"Stopping Apache"

Para que serve esse cifrão?

Minha pesquisa até agora:

Eu encontrei isso no manual bash:

extquote

If set, $'string' and $"string" quoting is performed within ${parameter} expansions enclosed in double quotes. This option is enabled by default.

... mas não estou encontrando nenhuma diferença entre strings com e sem o prefixo $ :

$ 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
    
por Ed Brannin 13.09.2012 / 23:43

3 respostas

97

Existem duas coisas diferentes acontecendo aqui, ambas documentadas no manual bash

$ '

A citação simples de cifrão é uma forma especial de citar:

Citação ANSI C

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.

$ "

Aspas duplas em dólar são para localização:

Tradução de local

A double-quoted string preceded by a dollar sign (‘$’) will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted.

    
por 14.09.2012 / 00:51
19

Quando uma string é expandida dentro de $'' , as seqüências de escape são interpretadas. A partir do manpage:

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.

Um exemplo fácil é a sequência de escape \ n para uma nova linha:

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

$ 

Nota: Você pode obter resultados diferentes em outros shells, pois echo pode interpretar seqüências de escape sem fornecer opções.

    
por 14.09.2012 / 00:40
-4

Você está interpretando mal o manual. Você só verá um efeito quando uma string $ -quoted estiver dentro de uma expansão ${parameter} .

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

Fonte e outras leituras: link

    
por 13.09.2012 / 23:51