Подстановочные знаки в дочернем процессе узла [дубликат]

Используйте getchar() перед вызовом второго scanf().

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);
10
задан Filburt 30 July 2012 в 08:46
поделиться

2 ответа

Какую ОС вы используете? В ОС Unix-семейства (например, Linux, MacOS) программы ожидают, что процесс оболочки расширит аргументы имени файла подстановки и передаст расширение в argv[]. В ОС Windows программы обычно ожидают расширения самих подстановочных знаков (хотя только в том случае, если они являются родными для Windows программ; портированные Unix-семейные программы могут попытаться запустить аргументы через уровень совместимости).

Ваш синтаксис выглядит так, как будто для системы Unix-семейства. Если это так, то при вызове spawn() вы обходите расширение оболочки, и ваш дочерний процесс будет обрабатывать точки и звездочки в аргументах буквально. Попробуйте использовать sh child_process вместо child_process и посмотрите, получите ли вы лучшие результаты.

1
ответ дан ebohlman 28 August 2018 в 09:56
поделиться

* расширяется оболочкой, а для 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 по какой-то причине, возможно, вы могли бы рассмотреть возможность расширения шаблона шаблона

Обновить

В базовом коде Joyent Node мы можем наблюдать подход к узлу с lib как node-glob вызывая произвольную команду в оболочке через 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]);
}
9
ответ дан Jed Richards 28 August 2018 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: