Правильно экранировать JSON для использования с bash - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть скрипт node.js:

const cp = require('child_process');
const json = JSON.stringify(['foo','bar']);

const k = cp.spawn('bash');

const cmd = `
  export foo=${json}
`;

k.stdin.end(`
    ${cmd}
    echo "foo is: $foo"; exit 0;
`);


k.stdout.pipe(process.stdout);
k.stderr.pipe(process.stderr);

Я получаю этот вывод на стандартный вывод:

foo is: '[foo,bar]'

и пытаюсь получить его вместо:

foo is: ["foo","bar"]

похоже, что это явление - то, что происходит, но я не могу понять, почему:

Почему строки JSON преобразуются с помощью оболочки bash

кто-нибудь знает, чточто происходит в моем скрипте и как заставить строку JSON оставаться JSON при прохождении через bash?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Поместите одинарные кавычки вокруг JSON.

const cmd = `
  export foo='${json}'
`;

Но если в JSON есть какие-либо одинарные кавычки, они должны быть вне кавычек, ограничивающих JSON, и вместо этого внутри набора двойных кавычек,Таким образом, вы должны сначала сделать:

json = json.replace(/'/g, "'\"'\"'");
0 голосов
/ 15 декабря 2018

Если вы хотите, чтобы bash оставил строку без изменений, вам нужно использовать одинарные кавычки .

Заключение символов в одинарные кавычки ('' ') сохраняет буквальное значениекаждый символ в кавычках.Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Этот код генерирует желаемый результат:

const cp = require('child_process');
const json = JSON.stringify(['foo','bar']);

const k = cp.spawn('bash');

// NOTE single quotes around '${json}':
const cmd = `
  export foo='${json}' 
`;

k.stdin.end(`
    ${cmd}
    echo "foo is: $foo"; exit 0;
`);


k.stdout.pipe(process.stdout);
k.stderr.pipe(process.stderr);
...