Richtige Syntax, um ein `$` in einer Regex in einem Bash-Shell-Skript / Makefile zu umgehen?

3783
iceman

Ich laufe eine Makefile, die folgende Zeile enthält ...

find ./ -type f -regextype emacs -regex ".*tests$" | xargs rm -f 

und bekomme eine Fehlermeldung:

find ./ -type f -regextype emacs -regex ".*tests | xargs rm -f /bin/sh: 1: Syntax error: Unterminated quoted string 

Ich habe eine Google-Suche nach korrekten Fluchtwegen durchgeführt. Keine der Escape-Syntaxes, auf die ich gestoßen bin, scheint zu funktionieren (dh mit einfachen Anführungszeichen, mit einem einfachen Back-Slash und mit einem doppelten Backslash).

Läuft bash auf LXDE (Ubuntu 14.04).

Irgendwelche Vorschläge?

2
Make schluckt das Dollarzeichen. Versuchen Sie `find ./ -type f -regextype emacs -regex". * Test $$ "| xargs rm -f`. Weitere Informationen finden Sie unter [In Makefile entkommen] (http://stackoverflow.com/questions/2382764/escaping-in-makefile). John1024 vor 9 Jahren 0
OK. Antwort hinzugefügt John1024 vor 9 Jahren 0
Schön, dass Sie sich entschieden haben, eine umfassende Antwort hinzuzufügen. obwohl ich klicken würde akzeptieren, wenn Sie Ihren Kommentar einfach kopiert hätten! iceman vor 9 Jahren 0
Genau das, wonach ich gesucht habe! Ich wollte wirklich nicht den Kopf um Makefile herumfliegen, gefolgt von Muschelflucht, gefolgt von Regex-Flucht! CJxD vor 8 Jahren 0

1 Antwort auf die Frage

1
John1024

Das Problem

Vergleichen Sie die Zeile in der makefile:

find ./ -type f -regextype emacs -regex ".*tests$" | xargs rm -f 

Mit der Zeile in der Fehlermeldung:

find ./ -type f -regextype emacs -regex ".*tests | xargs rm -f 

Es scheint, dass das makeschluckte $".

Die Lösung

Um dies zu vermeiden, muss das Dollarzeichen gesperrt werden. Versuchen:

find ./ -type f -regextype emacs -regex ".*tests$$" | xargs rm -f 

Dokumentation

Aus dem GNU Make Manual Abschnitt 4.2 :

Da Dollarzeichen verwendet werden, um variable Verweise zu erstellen, müssen Sie, wenn Sie wirklich ein Dollarzeichen in einem Ziel oder einer Voraussetzung haben möchten, zwei davon schreiben, "$$" (siehe Verwenden von Variablen). Wenn Sie die sekundäre Erweiterung aktiviert haben (siehe Sekundäre Erweiterung) und ein literales Dollarzeichen in der Voraussetzungsliste haben möchten, müssen Sie tatsächlich vier Dollarzeichen ("$$$$") schreiben.