如何从.ts文件调用Shell脚本并实现数据传递?
问题解决:Shell脚本与TypeScript文件的数据传递
核心问题分析
你的代码逻辑存在循环调用:myTsFile.ts调用loadHistory函数,而loadHistory里又用exec调用loadRecords.sh,后者会再次启动myTsFile.ts,导致程序陷入无限循环进而停滞。另外,loadHistory固定返回{count:0},这就是终端输出0 data loaded的直接原因。
解决方案步骤
1. 移除循环调用逻辑
删掉loadData.ts里的exec相关代码——当前流程是Shell触发TS,TS调用函数获取数据后返回结果即可,完全不需要在TS函数内反向调用Shell。
2. 让loadHistory正确返回记录数量
直接将从模拟器拿到的allRecords.length作为count值返回。
3. 完善命令行参数解析
补充myTsFile.ts中未定义的options,确保能正确获取--depth等命令行参数。
修改后的代码
loadData.ts
#!/usr/bin/env ts-node import { RecordRequest } from "./requests.js"; import { RecordResponse } from "./responses.js"; import { Simulator } from "simulator"; export async function loadHistory(request: RecordRequest): Promise<RecordResponse> { console.log("request => ", request.depth); const simulator = new Simulator(); const allRecords = simulator.getAllRecords("123"); console.log("allRecords => ", allRecords.length); // 直接返回获取到的记录数量 return { count: allRecords.length }; }
myTsFile.ts
import { loadHistory } from "../loadHistory.js"; // 补充命令行参数解析,这里用minimist示例,也可手动解析 import minimist from 'minimist'; const options = minimist(process.argv.slice(2)); const request = { depth: options.depth, verbose: options.verbose }; const response = await loadHistory(request); console.log(`${response.count} data loaded`);
loadRecords.sh
#!/bin/bash npm run --silent myTsFile -- "$@"
验证步骤
- 若使用
minimist解析参数,先安装依赖:npm install minimist - 在终端运行:
./loadRecords.sh --depth 1 - 此时终端会输出和
loadData.ts中allRecords.length一致的数值,比如521 data loaded。
内容的提问来源于stack exchange,提问作者GThree
相关产品推荐
相关产品推荐

