Groovy синтаксис не работает с обратными слешами

1285
Marlon

Я пытаюсь использовать обратную косую черту для команды ниже в Groovy синтаксис:

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

Когда я пытаюсь построить эту команду на конвейере Jenkins, выдается ошибка об этом синтаксисе. Еще до того, как я выполнил эту команду, в поле формы Дженкинса появилось предупреждение с красным синтаксисом, говорящее о неожиданном символе: '\'.

Что я могу сделать для замены или исправления ошибки с этой обратной косой чертой?

Groovy команды:

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; ''' } } 

Обратите внимание: у меня есть rm -fдля всех случаев в этот момент. Будет ли заменить все rm -fв findкоманде на папках очистки этапа.

ТКС заранее

0
этот гибридный слэш не поможет? `∖` user902300 5 лет назад 0
Не могли бы вы опубликовать свой скрипт Groovy (или Pipeline, или что-то еще, что вы используете для запуска этой команды)? jayhendren 5 лет назад 1
Вставил на вопрос тело заводной скрипт. @jayhendren Marlon 5 лет назад 0
Поскольку символ косой черты просто избегает следующего, возможно, вам просто нужно удалить ir. davidgo 5 лет назад 0
@davidgo в данном конкретном случае обратная косая черта определенно необходима, чтобы гарантировать, что точка с запятой анализируется командой find, а не shell. jayhendren 5 лет назад 1

3 ответа на вопрос

3
Aarkon

Это может помочь избежать побега вашего персонажа, как бы забавно это ни звучало. Просто поместите еще одну обратную косую черту перед вашей обратной косой чертой:

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

По крайней мере, IntelliJ не помечает это как синтаксически неправильное.

Звук, который работал нормально. Tks! Marlon 5 лет назад 0
0
jayhendren

На самом деле в вашем случае я бы даже не удосужился выяснить, как правильно убежать:

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

Когда вы передаете точку с запятой -exec, команда find создает несколько команд, по одной для каждого результата операции поиска (например rm -f /root/logfiles/instance/file1.log, rm -f /root/logfiles/instance/file2.log...), но когда вы используете плюс, команда find создает одну команду с несколькими аргументами, что намного эффективнее и быстро (например rm -f /root/logfiles/instance/file1.log /root/logfiles/instance/file2.log ...). См. Справочную страницу для поиска более подробной информации (извините, я не могу процитировать справочную страницу или предоставить более подробную информацию прямо сейчас; я на мобильном телефоне).

0
jikuja

Одним из решений было бы использовать долларовую косую черту, которая отключает интерполяцию строк и заменяет escape-символ на $.

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