Groovige Syntax funktioniert nicht mit Backslashes

1401
Marlon

Ich versuche, den Befehl unten in grooviger Syntax mit einem Backslash zu versehen:

find /path/folder-* -type f -iname "file*" -exec rm -f {} \; 

Wenn ich versuche, diesen Befehl in einer Jenkins-Pipeline zu erstellen, erhalte ich einen Fehler bezüglich dieser Syntax. Bevor ich diesen Befehl ausführt, wird in Jenkins Formularfeld eine Warnung mit roter Syntax angezeigt, die unerwartetes Zeichen enthält: '\'.

Was kann ich tun, um Fehler mit diesem Backslash zu ersetzen oder zu beheben?

Groovige Befehle:

node ("instance") { stage ("cleaning folders"){ sh '''  find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \; ''' } stage ("instance1"){ sh ''' rm -f /root/logfiles/instance1/* echo instance1;  scp 100.0.0.50:/var/log/file1.log /root/logfiles/instance1/file1.log; scp 100.0.0.50:/var/log/file2.log /root/logfiles/instance1/file2.log; ''' } stage ("instance1"){ sh ''' rm -f /root/logfiles/instance2/* echo instance2;  scp 100.0.0.51:/var/log/file1.log /root/logfiles/instance2/file1.log; scp 100.0.0.51:/var/log/file2.log /root/logfiles/instance2/file2.log; ''' } } 

Hinweis: Ich habe rm -fin diesem Moment für alle Fälle. Ersetzt alle rm -fzum findBefehl in den Bühnenreinigungsordnern.

Tks im Voraus

0
Dieser hybride Schrägstrich hilft dir nicht? `∖` user902300 vor 6 Jahren 0
Könnten Sie bitte Ihr Groovy-Skript (oder Pipeline oder was auch immer Sie verwenden, um diesen Befehl auszuführen) veröffentlichen? jayhendren vor 6 Jahren 1
Auf dem Fragenkörper das groovige Skript eingefügt. @ Jayhendren Marlon vor 6 Jahren 0
Da der Schrägstrich den folgenden einfach ersetzt, müssen Sie möglicherweise nur ir entfernen. davidgo vor 6 Jahren 0
@davidgo In diesem speziellen Fall ist der Backslash unbedingt erforderlich, um sicherzustellen, dass das Semikolon von find und nicht von der Shell analysiert wird. jayhendren vor 6 Jahren 1

3 Antworten auf die Frage

3
Aarkon

Es könnte helfen, Ihrem Fluchtcharakter zu entkommen, so komisch das auch klingen mag. Setzen Sie einfach einen weiteren Backslash vor Ihren Backslash:

stage ("cleaning folders"){ sh '''  find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \\; ''' } 

Zumindest markiert IntelliJ dies nicht als syntaktisch falsch.

Das klingt gut. Tks! Marlon vor 6 Jahren 0
0
jayhendren

Eigentlich würde ich mir in Ihrem Fall nicht die Mühe machen, die richtige Flucht zu finden:

stage ("cleaning folders"){ sh '''  find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} + ''' } 

Wenn Sie ein Semikolon passieren zu -exec, baut mehrere Befehle zu finden, eine für jedes Ergebnis der Suchoperation (zB rm -f /root/logfiles/instance/file1.log, rm -f /root/logfiles/instance/file2.log, ...), aber wenn man ein Plus verwenden, finden Konstrukte einen einzigen Befehl mit mehreren Argumenten, die eine effiziente viel mehr und schnell (zB rm -f /root/logfiles/instance/file1.log /root/logfiles/instance/file2.log ...). Weitere Informationen finden Sie auf der Manpage (sorry, ich kann die Manpage leider nicht zitieren oder kann im Moment nicht mehr detailliert angeben; ich bin mobil).

0
jikuja

Eine Lösung wäre die Verwendung von Dollar-Slashy, wodurch die Interpolation von Strings deaktiviert und Escape-Zeichen in $ geändert werden.

stage ("cleaning folders"){ sh script: $/ find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \; /$ }