SpyGlass 命令不在 PATH:sg_shell command not found 速查
更新时间:2026-10-23。FAQ 速查页,属于 EDA 工具排错系列。新开的终端窗口敲
sg_shell,回一句command not found——SpyGlass 明明装在工具盘上,但当前 shell 的 PATH 里没有SPYGLASS_HOME/bin这一段。EDA 工具几乎从不进系统默认 PATH,全靠source env.csh、module load spyglass这类环境注入动作把它请进来,注入没发生、发生了又没生效、或者生错了版本,表现出来的都是「命令不在」。后端实现侧同型问题见 Innovus/ICC2 工具不在 PATH,命令找到但起不来的下一步见 SpyGlass 缺少依赖库报错。
本文要回答的问题
- sg_shell: command not found,怎么确认工具装了没、PATH 里有没有?
- 交互窗口能用,CI 任务和调度作业里就找不到,差在哪?
- module 报了版本找不到,或者加载完版本是旧的,怎么纠?
- env.csh 在 bash 里 source 直接语法报错,怎么办?
一、报错原文与现象
bash: sg_shell: command not found
bash: spyglass: command not found
# 或:环境注入这一步本身就失败
bash: module: command not found
bash: env.csh: line 5: setenv: command not found
ERROR: Unable to find 'spyglass/2023.12' in MODULEPATH
# 或:能找到,但版本不对
sg_shell -version -> 2021.06(预期 2023.12)先把「不在」分成两档:完全找不到——PATH 里压根没有 SpyGlass 的 bin 目录,查环境注入链路;找到的是旧版——PATH 里有,但排在前面的那个不是项目要的版本,查 PATH 顺序与多版本共存。两档修法不同,别混在一起调。
二、可能原因总览
| 报错现象 | 可能原因 | 处置 |
|---|---|---|
| 所有终端都找不到 | 从未加载环境脚本/模块 | source 组内标准 env 脚本或 module load |
| 老窗口正常、新窗口找不到 | 环境只在老窗口手动 source 过 | 写进 shell 启动文件或封装启动脚本 |
| 交互能用、CI/作业里不行 | 非交互 shell 不读 .bashrc/.cshrc | 作业脚本首行显式 source 环境 |
| module: command not found | modules 系统本身没初始化 | source modules 的 init 脚本 |
| module 加载报版本不存在 | modulefile 版本号写错或已下线 | module avail 核对后再 load |
| 加载成功但版本是旧的 | PATH 里旧版路径排在前面 | purge 清场后按序重载 |
| source env.csh 报 setenv 错 | csh 脚本拿到 bash 里执行 | 用对应 shell 或找 bash 版 setup.sh |
三、逐条排查展开
第一步:确认三连——装了没、装在哪、PATH 里有没有。
which sg_shell spyglass 2>/dev/null
echo "$PATH" | tr ':' '\n' | grep -i spyglass
echo "$SPYGLASS_HOME"
ls /tools/spyglass/ 2>/dev/null || ls /opt/ 2>/dev/null先别急着改配置。如果工具目录本身不存在(比如这台机器没挂 SpyGlass 所在工具盘),PATH 怎么调都是白费力气。「找不到命令」的根子有时是「文件系统里根本没有这个命令」——这一步确认能省掉后面所有瞎试。工具盘没挂载就找管理员挂载,或换到挂载齐全的计算节点。
EDA 工具进 PATH 的标准姿势是注入,不是手改。 正规环境有两条注入通道:environment modules(module avail 看可加载项,module load spyglass/2023.12 注入指定版本)或厂商/组内维护的 setup 脚本(source /tools/spyglass/setup.sh)。在 .bashrc 里手写裸路径是技术债:版本升级时组内模板改一处全员生效,手改的人人的 PATH 都是化石。判别标准很简单——你 PATH 里 SpyGlass 那段是「模块加载出来的」还是「某年某月手抄进去的」,后者迟早咬人。
新开终端忘了 source,是最常见的人因。 昨天在老窗口手动 source 过环境,今天新开一个窗口当然找不到——source 只对当前 shell 进程生效,不传染。处置二选一:把加载命令写进 .bashrc(交互登录自动执行),或者组内封装一个 sg-run 启动脚本内部先 source 再拉起 sg_shell,所有人统一走入口脚本,不依赖各人记性。
CI 与调度作业是另一个世界:非交互、非登录 shell。 交互登录时 shell 会读 .bash_profile/.bashrc 完成环境注入;CI runner 和调度系统派发的作业起的是非交互 shell,默认不读这些启动文件,你的登录配置一概不执行。这就是「登录节点能用、提交的作业里 command not found」的全部原因。标准做法:作业脚本第一行就是环境加载,与交互环境同源同版本——组内维护一份 env.sh,交互和作业都 source 它,杜绝两环境漂移。临时验证可以用 bash -lc 'sg_shell -version' 包一层模拟登录 shell,如果这样能跑而裸跑不行,就坐实了是启动文件没被读取的问题。
csh 脚本拿到 bash 里 source,语法直接不兼容。 SpyGlass 历史环境脚本常以 env.csh 形式发布,里面是 setenv SPYGLASS_HOME ... 这种 csh 语法;在 bash 里 source 会报 setenv: command not found。bash 的对应写法是 export SPYGLASS_HOME=...。处置:找安装目录下有没有 setup.sh/.bashrc 风格的 bash 版本(正规安装通常两个都给);只有 csh 版本时,要么在 csh/tcsh 里 source,要么把 setenv 逐行翻成 export 维护一份组内 bash 版。别在 bash 里硬 source csh 脚本指望它「大概能跑」。
module 系统自身的问题有两层。 第一层:module: command not found——modules 框架本身没初始化,先 source 它的 init 脚本(通常在 /etc/profile.d/modules.sh 或组内指定路径),再谈 load。第二层:load 报版本不存在——modulefile 里的版本串和安装目录的真实版本号不一致(版本下线、路径改名、或纯粹写错),用 module avail spyglass 看真实可加载列表,照着写。
多版本共存时,PATH 顺序决定命运。 重复 module load 不同版本、或 .bashrc 私货在模块注入之后又 prepend 了一段旧路径,which 出来的就是旧版。排查:module list 看当前加载了什么;echo "$PATH" 从头看 SpyGlass 路径出现几次、谁先谁后。处置:module purge 清场后按顺序重新加载,并清掉 .bashrc 里的私货。版本串台不是小事——SpyGlass 的规则库、工程文件格式和 Tcl 接口按版本对齐,跑错版本会引出一串看似无关的报错,详见 SpyGlass 版本不兼容。
容器镜像里的「不在」要先问装了没有。 流程迁进容器后,宿主机的模块系统、工具盘挂载、license 变量全部不可见。常见翻车:镜像构建层里验证过(构建脚本 source 过环境),运行时 ENTRYPOINT 没 source,job 一跑就是 command not found;更狠的是镜像里只挂了 license、压根没装 SpyGlass 本体。判别口诀:容器里「构建时能跑」不等于「运行时能跑」,两条 shell 是两次环境。
颜色按语义分角色:红是报错入口与五类根因,蓝是排查动作,橙是修复,紫是防复发。主线是「先确认三连再分流」:工具盘没挂载是「根本没有」,先解决存在性;装了但 PATH 没有按场景分四支——交互侧 source 标准脚本、CI/作业首行显式加载、csh 脚本换 bash 版、版本串台 purge 重载;所有路径汇到同一个治本动作——交互 shell 与作业脚本共用一份 env.sh。
四、预防与纪律
- 组内统一 env.sh:SpyGlass 版本、SPYGLASS_HOME、license 变量集中一处,交互 shell 与 CI/作业脚本都 source 它,禁止个人手改 PATH。
- 作业与 CI 模板首行即环境加载,新任务从模板复制,不从空白写起。
- 版本切换走模块系统,先
module purge再 load 目标版本,杜绝叠加污染。 - bash 环境只 source bash 版脚本;组内维护 csh 到 bash 的对应版本,升级时两份同步更新。
- 新机器/新账号 checklist:工具盘挂载、modules 初始化、env.sh source、
which sg_shell验证,四步走完才算就绪。 - 版本基线登记:项目锁定的 SpyGlass 版本写进工程 README,发现串台对照基线纠正。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「运行环境」节点的入口级 FAQ 页,是 SpyGlass 其他排错页的前置条件——命令都起不来,谈不上 lint 与 CDC 检查本身的问题。环境通顺后的下一层问题见 SpyGlass 缺少依赖库报错 与 SpyGlass 版本不兼容;后端实现工具的对照页见 Innovus/ICC2 工具不在 PATH。
一句话总结
SpyGlass 命令不在 PATH 先做确认三连(装了没、装在哪、PATH 里有没有)再分流:工具盘未挂载解决存在性,装了但 PATH 无则交互侧 source 标准环境脚本、CI/作业首行显式加载、csh 脚本换 bash 版本、版本串台 purge 后按序重载;治本只有一条铁律——交互 shell 与调度作业 source 同一份组内 env.sh,谁手改 PATH 谁还债。