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

Deno中如何读取Shell选项 检测当前Shell是否为交互模式

Deno读取Shell选项、检测交互模式的方案

首先要明确:通过Deno.run/Deno.Command启动子Shell执行echo $-的方案从原理上就不可行——你新启动的bash子进程默认就是非交互模式,哪怕你给子进程加-i参数强制开交互,拿到的也只是这个人为构造的子进程状态,和你实际运行Deno的父Shell没有任何关系,结果没有参考价值。

可行实现方法

  • 直接判断Deno进程自身的交互状态
    绝大多数场景下,你要检测的“是否交互”本质是判断当前程序是不是跑在终端交互环境下,不需要绕去读Shell的$-变量,直接用Deno内置API判断标准输入是否连接到TTY即可,和Shell侧$-包含i的判断逻辑完全对齐:

    // 判断标准输入是否为终端设备
    const isInteractive = Deno.isatty(Deno.stdin.rid);
    if (isInteractive) {
      console.log("interactive");
    } else {
      console.log("not interactive");
    }
    

    管道输入、脚本重定向、后台运行等非交互场景下,这个接口会正确返回false。

  • 读取父Shell的$-选项值
    如果你确实需要拿到启动Deno的那个父Shell的完整选项标记,注意Shell默认不会把$-变量导出到子进程环境,没法直接从Deno的环境变量里读到,需要在启动Deno前显式导出该值:

    # 先把当前Shell的选项存入导出的环境变量
    export CURRENT_SHELL_OPTS=$-
    # 再启动Deno脚本
    deno run --allow-env your_script.ts
    

    之后在Deno代码里直接读取判断即可:

    const shellOpts = Deno.env.get("CURRENT_SHELL_OPTS") ?? "";
    const isShellInteractive = shellOpts.includes("i");
    

    不推荐通过遍历进程树、读取父进程cmdline的方式拿Shell选项,这套逻辑跨操作系统、跨Shell(bash/zsh/fish)的兼容性极差,维护成本很高。

注意:不要尝试通过给子bash加-i参数的方式伪造交互状态,这种方式拿到的结果完全不反映真实运行环境,会导致判断逻辑失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:15:36