#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.