You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从.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 -- "$@"

验证步骤

  1. 若使用minimist解析参数,先安装依赖:npm install minimist
  2. 在终端运行:./loadRecords.sh --depth 1
  3. 此时终端会输出和loadData.ts中allRecords.length一致的数值,比如521 data loaded。

内容的提问来源于stack exchange,提问作者GThree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:27:38