Execute o oneliner python no script bash

4

O seguinte é o one-liner de python que eu quero executar como parte do meu script bash

python -c "from xml.dom.minidom import parse;dom = parse('/path/to/pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"

(pom.xml é um arquivo xml do POM do maven)

Eu quero que o resultado do comando seja atribuído à variável MVN_VER

Este é o meu script base:

WS="/path/to"
PY_GET_MVN_VERS="from xml.dom.minidom import parse;dom = parse(\'${WS}/pom.xml\')\;print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == \'version\']"

funcion test_mvn {

        MVN_VER='python -c \"${PY_GET_MVN_VERS}\"'
        echo ${MVN_VERS}
}

test_mvn

No entanto, ele não é executado. Se eu executar o script com a opção + x, é o que eu vejo:

++ python -c '"from' xml.dom.minidom import 'parse;dom' = 'parse(\'\''/path/to/pom.xml\'\'')\;print' '[n.firstChild.data' for n in 'dom.childNodes[0].childNodes' if n.firstChild and n.tagName == '\'\''version\'\'']"'
  File "<string>", line 1
    "from

Acho que tem algo a ver com a fuga do código python. Como posso escapar disso corretamente?

    
por Anthony Kong 29.12.2011 / 10:42

1 resposta

6

Não há necessidade de escapar ou mover o argumento para sua própria variável.

Mas, mantendo-o praticamente o mesmo, o seguinte funciona para mim:

#!/usr/bin/env bash
WS="/Users/danielbeck/Desktop"
PY_GET_MVN_VERS="from xml.dom.minidom import parse;dom = parse('${WS}/pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"
function test_mvn {
        MVN_VER=$( python -c "${PY_GET_MVN_VERS}" )
        echo ${MVN_VER}
}
test_mvn

/Users/danielbeck/Desktop/pom.xml é o POM mínimo de exemplo dos documentos do Maven:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

Saída:

[u'1']

Por favor, jogue fora seu código e use o meu (depois de ajustar WS ) ao invés de ajustar o seu até que ele funcione. Você tem alguns erros de sintaxe lá.

    
por 29.12.2011 / 10:55

Tags