Co to znaczy mieć w skrypcie ciąg „$-prefixed”?

81

Właśnie widziałem to w skrypcie inicjującym:

echo $"Stopping Apache"

Do czego służy ten znak dolara?

Moje dotychczasowe badania:

Znalazłem to w podręczniku bash:

ekstrawagancja

Jeśli ustawione, $'string'i $"string"powołując się przeprowadzone w ${parameter}ekspansji zamkniętych w cudzysłowach. Opcja jest wyłączona domyślnie.

... ale nie znajduję żadnej różnicy między łańcuchami z $prefiksem i bez :

$ 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
źródło

Odpowiedzi:

111

Działają tu dwie różne rzeczy, obie udokumentowane w bashinstrukcji

$ '

Pojedynczy cytat ze znakiem dolara to specjalna forma cytowania:

Cytowanie ANSI C.

Słowa w postaci $ „string” są traktowane specjalnie. Słowo rozwija się do łańcucha znaków, a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.

$ ”

Podwójny cytat ze znakiem dolara dotyczy lokalizacji:

Tłumaczenie regionalne

Ciąg cudzysłowu poprzedzony znakiem dolara („$”) spowoduje, że zostanie on przetłumaczony zgodnie z bieżącymi ustawieniami narodowymi. Jeśli bieżące ustawienia narodowe to C lub POSIX, znak dolara jest ignorowany. Jeśli ciąg zostanie przetłumaczony i zastąpiony, zamiennik zostanie podany w cudzysłów.

jw013
źródło
22

Po rozwinięciu łańcucha wewnątrz $''sekwencje specjalne są interpretowane. Z strony podręcznika:

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.

Prostym przykładem jest sekwencja ucieczki \ n dla nowego wiersza:

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

$ 

Uwaga: Możesz uzyskać różne wyniki w innych powłokach, co echomoże interpretować sekwencje specjalne bez podania opcji.

Jordan
źródło
8
Nie ma wzmianki o $"..."pytaniu.
Peter.O,
-4

Źle interpretujesz instrukcję. Zobaczysz efekt tylko wtedy, gdy $ -quoted ciąg jest wewnątrz w ${parameter}ekspansji.

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

Źródło i dalsze czytanie: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
źródło
6
To nie odpowiada na pytanie: $"…"jest coś innego.
Gilles
4
Przykro nam, ale twoja odpowiedź jest błędna: nie ma potrzeby używania ${}rozszerzenia, aby skorzystać z cytowania ANSI. Sprawdź sam:echo $'ab\ncd'
rozcietrzewiacz
1
Myślę, że ta odpowiedź próbowała wyjaśnić extquoteniepoprawnie zamiast zadawać pytanie.
jw013,
1
"${...}"jest inny niż$"..."
GypsyCosmonaut