O que significa ter uma "string prefixada em dólares" em um script?

81

Acabei de ver isso em um script init:

echo $"Stopping Apache"

Para que serve esse cifrão?

Minha pesquisa até agora:

Encontrei isso no manual do bash:

citar

Se definido, $'string'e a $"string"citação é realizada em ${parameter}expansões entre aspas duplas. Essa opção é ativada por padrão.

... mas não estou encontrando nenhuma diferença entre cadeias 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
Ed Brannin
fonte

Respostas:

111

Há duas coisas diferentes acontecendo aqui, ambas documentadas no bashmanual

$ '

As aspas simples com cifrão são uma forma especial de citar:

Citação ANSI C

Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para cadeia, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.

$ "

As aspas duplas com cifrão são para localização:

Tradução local

Uma sequência de aspas duplas precedida por um sinal de dólar ('$') fará com que a sequência seja traduzida de acordo com o código de idioma atual. Se o código do idioma atual for C ou POSIX, o cifrão será ignorado. Se a sequência for traduzida e substituída, a substituição será citada duas vezes.

jw013
fonte
22

Quando uma string é expandida dentro de $'', as seqüências de escape são interpretadas. Na página de 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.

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 echopode interpretar seqüências de escape sem fornecer opções.

jordanm
fonte
8
Não há menção $"...", conforme a pergunta.
precisa saber é o seguinte
-4

Você está interpretando mal o manual. Você verá um efeito apenas quando uma sequência de cotações $ estiver dentro de uma ${parameter}expansão.

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

Fonte e leituras adicionais: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
fonte
6
Isso não responde à pergunta: $"…"é algo diferente.
Gilles
4
Desculpe, mas sua resposta está errada: não há necessidade de usar a ${}expansão para usar a citação ANSI. Verifique você mesmo:echo $'ab\ncd'
rozcietrzewiacz 14/09/12
1
Eu acho que essa resposta estava tentando explicar extquoteincorretamente, em vez do que a pergunta estava fazendo.
jw013
1
"${...}"é diferente de$"..."
GypsyCosmonaut