sed команда UNIX Groovy

#shell #unix #groovy

#оболочка #unix #groovy

Вопрос:

Я выполняю обновление schellscript.sh из groovy.shellscript должен обновить другой XML-файл с помощью команды sed, но обновление XML не происходит, когда я запускаю с помощью groovy, но это происходит, когда я запускаю shellscript из командной строки

groovy

 def proc = ['/move/update.sh',name].execute()
  

shellscript

 NAME=$1
sed -i "s/ITEM_NAME/$1/g" script.xml
  

script.xml
не обновляется, когда я запускаю с помощью groovy

Комментарии:

1. Находится ли groovy-процесс в правильном каталоге?

2. Я запускаю groovy с внешней программой … groovy также вызывает shellscript, но shellscript не может обновить другой файл при его выполнении с помощью groovy

3. Я предлагаю вам ввести полный путь к файлу xml в скрипт: sed -i ... /path/to/script.xml

4. Кроме того, имеет ли пользователь, запускающий процесс groovy, (а) права на выполнение сценария и (б) права на изменение XML-файла?

5. он имеет право на выполнение скрипта, как проверить, имеет ли он право изменять XML-файл? Я уже обновил свойство XML-файла как 7777

Ответ №1:

Вы должны выяснить, что происходит с этим порожденным процессом, вместо того, чтобы спрашивать нас. Взгляните на этот пример:

 $ groovysh
Groovy Shell (3.0.4, JVM: 14.0.1)
Type ':help' or ':h' for help.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> proc = ['sh', '-c', 'echo "this is stdout"; echo "this is stderr">amp;2; exit 3'].execute()
===> Process[pid=29552, exitValue="not exited"]
groovy:000> proc.err
===> java.lang.ProcessImpl$ProcessPipeInputStream@e154848
groovy:000> proc.err.getText()
===> this is stderr

groovy:000> proc.getText()
===> this is stdout

groovy:000> proc.exitValue()
===> 3
  

Этот сценарий оболочки не нужен: groovy может вызывать напрямую: учитывая это

 $ cat script.xml
<item name="ITEM_NAME"/>
$ cat sed.groovy
def name = 'this is the item name'
def cmd = ['sed', '-i', '', "s/ITEM_NAME/${name}/", 'script.xml']
println cmd
def proc = cmd.execute()
println proc.exitValue()
println proc.err.getText()
println proc.getText()
  

Обратите внимание, что я нахожусь на Mac, где -i для параметра sed требуется значение. Измените этот код, если вы используете GNU sed.

Запуск выглядит следующим образом

 $ groovy sed.groovy
[sed, -i, , s/ITEM_NAME/this is the item name/, script.xml]
0


$ cat script.xml
<item name="this is the item name"/>
  

С другой стороны, groovy может читать файл, выполнять текстовые замены и записывать файл, поэтому вам вообще не нужно вызывать sed.