我有这个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);
我将输出输出到stdout:
foo is: '[foo,bar]'
并且正尝试获取它:
foo is: ["foo","bar"]
似乎正在发生这种现象,但我不知道为什么:
Why JSON strings transform with bash shell
有人知道我的脚本中发生了什么以及如何使JSON字符串在通过bash传输时保持JSON吗?
答案 0 :(得分:2)
如果您希望bash保持字符串不变,则需要使用single quotes。
用单引号('')引起来的字符会保留文字 引号内每个字符的值。单引号可能不会 即使在单引号前加反斜杠,也会出现这种情况。
此代码生成所需的输出:
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);
答案 1 :(得分:2)
在JSON周围加上单引号。
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single, IncludeExceptionDetailInFaults:=True, AddressFilterMode:=AddressFilterMode.Any)>
Public Class mySvc
...
但是,如果JSON中有任何单引号,则它们必须位于界定JSON的引号之外,而应位于一组双引号之内。因此,您首先应该这样做:
const cmd = `
export foo='${json}'
`;