2012-06-08 10 views
7

Estoy tratando de usar la función child_process.spawn. La sintaxis esnodeJS child_process.spawn no funciona cuando uno de los args tiene un espacio en él

child_process.spawn(command, args=[], [options]) 

Siempre incluyo un espacio en cualquiera de los elementos de la matriz args, el comando simplemente emite el argumento. Este es un código que utilicé para probarlo

var spawn = require("child_process").spawn 

console.log("This works"); 
var watcher = spawn("ls", ["-l"]); 
watcher.stdout.on('data', function(data) { 
    process.stdout.write(data.toString()); 
}); 

console.log("This does not work"); 
watcher = spawn("ls", ["-l", "/path with space in it"]); 
watcher.stdout.on('data', function(data) { 
    process.stdout.write(data.toString()); 
}); 

¿Este es un error en el nodo? ¿Necesito escapar del espacio?

Editar: El código de arriba es solo un ejemplo. Aquí está el código real. ¿Tal vez tiene que ver con las tuberías?

watcher = spawn("supervisor", ["--extensions\ 'coffee|js|css|coffeekup'", "src/app.coffee"]); 
+0

Parece que funciona bien para mí usando el nodo 0.6.17 en Linux en el REPL. Creó un directorio con el mismo nombre en el nivel raíz y usó su código. –

+0

También se trabajó desde un archivo. ¿Podría proporcionar más información, como la versión de nodo y el sistema operativo? –

+0

¿Qué versión de nodo estás ejecutando? – joshuapoehls

Respuesta

22

No ponga espacios en args, sólo tiene que utilizar otro argumento en la matriz

var watcher = spawn("supervisor", [ 
    "--extensions", 
    "'coffee|js|css|coffeekup'", 
    "src/app.coffee" 
]); 

Un poco práctico atajo que encontré si desea obtener una salida de diagnóstico rápido de sus procesos hijo es pasar el {stdio: "inherit"} en options

var watcher = spawn("supervisor", [ 
    "--extensions", 
    "'coffee|js|css|coffeekup'", 
    "src/app.coffee" 
], {stdio: "inherit"}); 

de esta manera usted puede ver si todo funciona correctamente de inmediato.

Por último, dependiendo de dónde esté instalado supervisor, es posible que desee considerar el uso de la ruta completa.

var watcher = spawn("/path/to/supervisor", ...); 
+1

¿Sabes si es posible usar la sustitución de comandos dentro de una llamada de generación? Algo como 'docker rm $ (docker ps -a)' –

+0

Esto es bash. Usas "exec" para eso: 'child_process.exec ('rm $ (docker ps -a)', {shell: '/ bin/bash'}, console.log)'. – Dinoboff

+0

¿Necesita las comillas simples para las extensiones de archivo? – Dinoboff

Cuestiones relacionadas