2013-07-25 4 views
4

Я пытаюсь запустить дочерний процесс для изменения файла (в два этапа) перед чтением измененного содержимого из stdout. Я пытаюсь сделать это, используя подстановку процессов, которая отлично работает в bash, но не тогда, когда я пытаюсь выполнить ее с узла.Подстановка процесса - Node.js child_process

Это своего рода, что команда выглядит ..

var p = exec('command2 <(capture /dev/stdout | command1 -i file -) -', 
function (error, stdout, stderr) { 
    console.log(stderr); 
}); 

Stderr принтами:

/bin/sh: -c: line 0: syntax error near unexpected token `(' 

Что такое правильный способ сделать это в узле?

ответ

3

Я решил это, поместив команды в сценарий оболочки и вызвав скрипт из дочернего процесса узла. Я также необходимо добавить следующие параметры для Баша в режиме Posix, чтобы позволить замену процесса:

set +o posix 

Существует, вероятно, лучше способ сделать это непосредственно из узла, но это сделало работу. Приветствия!

0

вы можете получить команду bash с помощью команды bash -c 'command'. Я протестировал это, и он работает с заменой процесса и child_process.

1

Вы можете spawnchild_process с Баш замещения в узле с помощью вызова команды sh с -c флагом.

Команда sh использует ваш интерпретатор bash по умолчанию, а флаг -c просит интерпретатор читать команды из строки, то есть: $(echo $PATH). Затем дополнительные флаги передаются в их нормальные позиционные ссылки, такие как: $0, $1, ect.

Так примером может быть:

const spawn = require('child_process').spawn; 

const prg = 'sh', 

    args = [ 
     '-c', 
     'echo $($0 $1)', 
     'ls', // $0 
     '-la' // $1 
    ], 

    opts = { 
     stdio: 'inherit' 
    }; 

// Print a directory listing, Eg: 'ls -la' 
const child = spawn(prg, args, opts); 
Смежные вопросы