Подстановочные знаки в child_process spawn()?
Я хочу выполнить команду типа doSomething./myfiles/*.csv с икру в node.js. Я хочу использовать spawn вместо exec, потому что это какой-то процесс просмотра, и мне нужен вывод stdout.
Я пробовал это
var spawn = require('child_process').spawn;
spawn("doSomething", ["./myfiles/*.csv"]);
Но тогда подстановочный символ *.csv не будет интерпретироваться.
Невозможно использовать подстановочные знаки при использовании spawn()? Существуют ли другие возможности для решения этой проблемы?
Спасибо
Торбен
Ответы
Ответ 1
*
расширяется оболочкой, а для child_process.spawn
аргументы проходят через строки, поэтому никогда не будут должным образом расширены. Это ограничение spawn
. Вместо этого вы можете попробовать child_process.exec
, это позволит оболочке правильно расширять любые шаблоны:
var exec = require("child_process").exec;
var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) {
// Handle result
});
Если вам действительно нужно использовать spawn
, по какой-то причине, возможно, вы могли бы рассмотреть возможность расширения шаблона шаблона в Node с помощью lib, например node-glob. перед созданием дочернего процесса?
Update
В базовом коде Joyent Node мы можем наблюдать подход для вызова произвольной команды в оболочке через spawn
, сохраняя при этом полное расширение подстановочных оболочек:
https://github.com/joyent/node/blob/937e2e351b2450cf1e9c4d8b3e1a4e2a2def58bb/lib/child_process.js#L589
А вот какой-то псевдокод:
var child;
var cmd = "doSomething ./myfiles/*.csv";
if ('win32' === process.platform) {
child = spawn('cmd.exe', ['/s', '/c', '"' + cmd + '"'],{windowsVerbatimArguments:true} );
} else {
child = spawn('/bin/sh', ['-c', cmd]);
}
Ответ 2
Какую ОС вы используете? В Unix-семейных ОС (например, Linux, MacOS) программы ожидают, что процесс оболочки расширит аргументы имени файла подстановки и передаст расширение в argv[]
. В ОС Windows программы обычно ожидают расширения самих подстановочных знаков (хотя только в том случае, если они являются родными для Windows программ; портированные Unix-семейные программы могут в большинстве случаев пытаться запускать аргументы через уровень совместимости).
Ваш синтаксис выглядит как система Unix-семейства. Если это так, то при вызове spawn()
вы обходите расширение оболочки, и ваш дочерний процесс будет обрабатывать точки и звездочки в аргументах буквально. Попробуйте использовать sh child_process
вместо child_process
и посмотрите, получите ли вы лучшие результаты.
Ответ 3
Вот самое простое решение:
spawn("doSomething", ["./myfiles/*.csv"], { shell: true });
Как предложил @JamieBirch в своем комментарии, ключ говорит spawn()
использовать оболочку ({ shell: true }
, см. документы), поэтому подстановочный знак правильно определен.