Подстановка процесса - Node.js child_process

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

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

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 `('

Как правильно сделать это в узле?

4 ответа

Решение

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

set +o posix

Вероятно, есть более хороший способ сделать это непосредственно из узла, но он сделал свою работу. Ура!

Это вызвано тем, что bash работает в режиме posix при вызове как /bin/sh,

Вызывая bash прямо из /bin/bash избегает этого:

child_process.execSync('diff <(curl a) <(curl b)', {shell: '/bin/bash'});

Вы можете spawn child_process с заменой bash в Node, вызывая sh команда с -c флаг.

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

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

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);

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

Другие вопросы по тегам