2011-11-22 23 views
6

Necesito pasar un texto que incluya espacios en blanco y otros caracteres a un script que está siendo ejecutado por GNU Parallel.Cómo pasar argumentos cotizados a GNU Parallel

Aquí es un ejemplo muy sencillo:

$ seq 1 3 | parallel echo "Quoted ' (text)" 

El resultado del ejemplo sería la siguiente:

sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file 
sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file 
sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file  

Sin embargo, si hago esto todo funciona:

seq 1 3 | parallel echo "\"Quoted ' (text)\"" 

Sucede para ejecutar esto desde una secuencia de comandos de Python, por lo que antes de pasar los argumentos, los estoy citando en el script como th es:

args = ["Some arg", "Another arg", "etc."] 
args = ' '.join(pipes.quote(pipes.quote(arg)) for arg in args) 

Pero no parece una solución limpia.

¿Alguien sabe de una mejor manera de pasar argumentos a GNU Parallel?

Gracias!

+0

'no es una solución limpia', pero ¿funciona? Buena suerte. – shellter

Respuesta

8
zsh-4.3.12[sysadmin]% print -l {1..3} | 
    parallel -q echo "Quoted ' (text)" 
Quoted ' (text) 1 
Quoted ' (text) 2 
Quoted ' (text) 3 
+1

¡Gracias! Busqué en la página del hombre algo tan simple pero no pude encontrar. Gracias por responder tan claramente y no decir algo así como "¡Lee la página del manual!" Tan sencillo. – chaimp

+1

Para hacer esto un poco más claro: los argumentos pasados ​​a los comandos a través de paralelo son expandidos por el shell dos veces: una en la invocación de paralelo, y una cuando el paralelo ejecuta su comando. '-q' previene la segunda expansión de shell. – mortehu

Cuestiones relacionadas