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
相关产品推荐
相关产品推荐

