在shell脚本中执行JavaScript方法时能否获取其返回值
问题原因
Node.js 中console.log默认全部输出到标准输出流(stdout),而shell的$()命令替换会捕获执行命令的全部stdout内容,因此你代码中所有console.log的输出都会被赋值给output变量。另外你写的output = $(node test.js)存在shell语法错误,变量赋值时等号两侧不能有空格,需要改为output=$(node test.js)。
解决方案
方案1:区分输出流(推荐)
将调试用的非目标日志全部输出到标准错误流(stderr),$()默认仅捕获stdout内容,stderr中的日志不会被捕获到变量中,仅返回你需要的目标值:
修改后的test.js代码如下:
async function getData() { let a = 100; // 其他修改a的函数调用 // 所有调试日志改用console.error输出到stderr console.error('调试日志:a当前值为', a); return a; } (async () => { // 仅目标返回值用console.log输出到stdout,会被shell捕获 console.log(await getData()); })();
shell侧不需要额外修改,直接用output=$(node test.js)就能拿到变量a的值。
方案2:加专属标记过滤
如果你不想修改原有日志的输出方式,可以给目标返回值加上专属的固定前缀标记,在shell侧通过过滤命令提取对应值:
修改test.js中目标输出的代码:
// 给目标输出加专属前缀 console.log('__MY_TARGET_VALUE__:' + await getData());
shell侧使用过滤命令提取值:
output=$(node test.js | grep '__MY_TARGET_VALUE__' | awk -F ':' '{print $2}')
内容的提问来源于stack exchange,提问作者lakshmiravali rimmalapudi
相关产品推荐
相关产品推荐

