Подстановка процесса - 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.