Was bedeutet es, in einem Skript eine Zeichenfolge mit dem Präfix $ "dollarsign" zu haben?

81

Ich habe das gerade in einem Init-Skript gesehen:

echo $"Stopping Apache"

Wofür ist das Dollarzeichen?

Meine bisherigen Forschungen:

Ich fand das im Bash-Handbuch:

extquote

Wenn gesetzt, $'string'und $"string"unter Angabe innerhalb ausgeführt ${parameter}in Anführungszeichen Erweiterungen. Diese Option ist standardmäßig aktiviert.

... aber ich finde keinen Unterschied zwischen Strings mit und ohne $Präfix:

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

Antworten:

111

Hier laufen zwei verschiedene Dinge ab, die beide im bashHandbuch dokumentiert sind

$ '

Ein einfaches Anführungszeichen mit Dollarzeichen ist eine spezielle Form der Anführungszeichen:

ANSI C-Zitat

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu einer Zeichenfolge erweitert, wobei mit einem Backslash versehene Zeichen gemäß dem ANSI C-Standard ersetzt werden.

$ "

Das doppelte Anführungszeichen mit dem Dollarzeichen gilt für die Lokalisierung:

Übersetzung des Gebietsschemas

Eine Zeichenfolge in doppelten Anführungszeichen mit vorangestelltem Dollarzeichen ('$') bewirkt, dass die Zeichenfolge entsprechend dem aktuellen Gebietsschema übersetzt wird. Wenn das aktuelle Gebietsschema C oder POSIX ist, wird das Dollarzeichen ignoriert. Wenn die Zeichenfolge übersetzt und ersetzt wird, wird die Ersetzung in doppelte Anführungszeichen gesetzt.

jw013
quelle
22

Wenn eine Zeichenfolge innerhalb von erweitert wird $'', werden die Escape-Sequenzen interpretiert. Aus der 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.

Ein einfaches Beispiel ist die Escape-Sequenz für eine neue Zeile:

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

$ 

Hinweis: In anderen Shells erhalten Sie möglicherweise andere Ergebnisse als echobei der Interpretation von Escape-Sequenzen, ohne dass Optionen angegeben werden.

Jordanien
quelle
8
Es gibt keine Erwähnung von $"..."gemäß der Frage.
Peter.O
-4

Sie interpretieren das Handbuch falsch. Sie werden nur dann einen Effekt sehen, wenn sich eine Zeichenfolge mit Anführungszeichen in einer ${parameter}Erweiterung befindet.

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

Quelle und weiterführende Literatur: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

Benjamin Barenblat
quelle
6
Dies beantwortet nicht die Frage: $"…"ist etwas anderes.
Gilles
4
Entschuldigung, aber Ihre Antwort ist falsch: Es ist nicht erforderlich, eine ${}Erweiterung zu verwenden, um ANSI-Anführungszeichen zu verwenden. echo $'ab\ncd'
Überzeugen
1
Ich denke, diese Antwort versuchte, extquotefalsch zu erklären, anstatt was die Frage stellte.
JW013
1
"${...}"ist anders als$"..."
GypsyCosmonaut