Подстановочные знаки в 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 }, см. документы), поэтому подстановочный знак правильно определен.