Calibre 命令找不到:calibre: command not found 排查速查
更新时间:2026-10-22。FAQ 速查页,属于 EDA 工具排错系列。Calibre(Mentor/Siemens EDA 的物理验证套件,DRC/LVS/PEX 一把抓)在 shell 里的入口是
calibre、calibredrv、calibreview几个命令。装好了却敲出一句 command not found,是换机器、换账号、搭 CI 节点第一天最常见的拦路错。它几乎不代表 Calibre 没装,而是「当前这个 shell 不知道去哪个目录找它」:PATH 没配、CALIBRE_HOME/MGC_HOME没指对、module 没加载、远程作业是非登录 shell,任一环节错位都会命中。全簇入口见 开源/EDA 工具报错排查总览,命令能起来之后的两道坎分别是 license 签到(见 Calibre license 取不出来)和 rule deck 找文件(见 Calibre 模块/单元找不到),正常启动后的验证流程见 Calibre 物理验证实操。
本文要回答的问题
- 明明装了 Calibre,为什么敲
calibre报 command not found? which找不到时,怎么确认 Calibre 装没装、装在哪一版目录下?MGLS_LICENSE_FILE都配好了,为什么命令还是找不到?- 交互终端能跑,为什么脚本、CI、
ssh host calibre里就 command not found? - 一台机器装了多版 Calibre,怎么确认自己跑到的是哪一版?
一、报错原文与现象
bash 下最典型的形态,shell 把当前搜索路径原样吐出来,明确告诉你 PATH 里没有这个名字:
$ calibre
-bash: calibre: command not found
$ calibredrv
-bash: calibredrv: command not found
$ which calibre
/usr/bin/which: no calibre in (/usr/local/bin:/usr/bin:/bin)zsh 与 tcsh 下措辞不同,含义完全一样,都是 shell 搜遍 PATH 没命中可执行文件:
$ calibreview
zsh: command not found: calibreview
% calibre
calibre: Command not found.第二种形态出现在脚本里写死全路径、换到别人机器或 CI 节点执行时。路径前缀是装机人本地的目录,新机器上根本不存在:
$ /tools/mentor/calibre/2019.3/bin/calibre -drc runset.drc
-bash: /tools/mentor/calibre/2019.3/bin/calibre: No such file or directory第三种形态容易被误判成 PATH 问题:which 能看到文件,真跑却得到 Permission denied,或者全路径执行报 No such file——前者是 wrapper 脚本没有执行权限,后者常见于 32/64 位平台子目录拿错、脚本首行解释器不存在。本篇第三节末尾把这类「找到了但跑不起来」单独分流。
二、可能原因速查表
| 报错/现象 | 最可能原因 | 一条命令确认 | 处置 |
|---|---|---|---|
| which 输出里没有 Calibre 目录 | PATH 未配置或环境脚本没 source | echo $PATH | source 站点环境脚本或 module load 后再用 |
| 配了 PATH 但重开终端失效 | 写错配置文件(bashrc/profile 混淆) | shopt -q login_shell; echo $? | 按登录方式写对文件并重新加载 |
| 交互行、脚本里不行 | 非交互 shell 不读 .bashrc | env -i bash -lc 'which calibre' | 脚本首行显式 source 环境 |
| 变量指错版本目录 | CALIBRE_HOME/MGC_HOME 缺失或指向旧版 | ls $CALIBRE_HOME/bin/calibre | 改指真实安装根,重 source |
| 一台机器多版本 Calibre | PATH 顺序决定先命中谁 | which -a calibre | 调整顺序或用 module load 切版本 |
| module load 报模块不存在 | 模块名/版本写错或模块树没挂 | module avail calibre | 按 avail 列出的全名加载 |
| Permission denied | wrapper 脚本缺执行权限或挂载挂了 noexec | ls -l $(which calibre) | chmod +x 或找管理员换挂载选项 |
| 全路径报 No such file | 32/64 位 bin 子目录拿错、解释器缺失 | file .../bin/calibre | 改用对平台的 bin,非 PATH 问题 |
| 能启动但报 license 错 | PATH 已通,卡在授权 | echo $MGLS_LICENSE_FILE | 转 license 签出失败篇 |
| 脚本写死全路径换机即挂 | 个人目录路径进了工程脚本 | grep -n /tools/mentor 脚本名 | 改用环境变量或 module,不写死前缀 |
三、逐条排查展开
第一步永远是查可见性、查搜索域、查安装位置三件套。
which -a calibre calibredrv 2>/dev/null
echo $PATH
ls -d /tools/mentor/calibre/*/bin 2>/dev/nullwhich -a 列出 PATH 中所有同名命中,第一个就是实际执行的那个;没有任何输出时,问题在可见性而非存在性。ls 安装根回答「Calibre 到底装没装、装了哪几版」。Calibre 常见安装形态是 /tools/mentor/calibre/<版本号>/bin/calibre,同目录下还有 calibredrv、calibreview 等入口;部分站点在 bin 之下再按平台分子目录(如 32 位与 64 位两套),三个命令一起找,都找不到才说明 PATH 里确实缺这个 bin。
第二步核对 Calibre 的环境变量三件套:CALIBRE_HOME、MGC_HOME、MGLS_HOME。 Calibre 历史上是 Mentor 工具,老站点普遍用 MGC_HOME 指向安装根,较新的封装用 CALIBRE_HOME,MGLS_HOME 则指向授权系统(MGLS)目录。注意一个高频误区:license 变量和二进制路径是两件事——MGLS_LICENSE_FILE 配对了只解决签到,shell 照样可以因为 PATH 里没有 bin 而 command not found。正确状态是安装根变量有值、其下 bin/calibre 真实存在、bin 已进 PATH:
echo "$CALIBRE_HOME / $MGC_HOME / $MGLS_HOME"
ls -l "$CALIBRE_HOME/bin/calibre" 2>/dev/null || ls -l "$MGC_HOME/bin/calibre"变量为空、指向已经下线的旧版本目录,是「同事能用我不能用」的头号原因。站点若提供集中维护的环境脚本(命名各异,常见 calibre_setup.sh、mgc_env.sh),正解是 source 它,一次把安装根、PATH、license 变量、库路径设全,而不是自己手搓半截。
有 module 体系的站点,纪律是用 module load,而不是手改 PATH。
module avail calibre
module load calibre/2023.4
module listmodule avail 看站点装了哪些版本,加载时必须写 avail 里列出的全名(模块名和版本号各站点不同,凭印象写 calibre/latest 往往报模块不存在);module list 确认当前会话实际加载了谁。module 的价值在批量环境里加倍:作业脚本里写明加载哪个版本,结果可复现,不依赖提交者当下 export 的是谁。若 module 本身报 command not found,先 source 模块系统初始化(路径问管理员),否则一切 load 都无从谈起。
下面这张决策树把上面的判断收成一条收敛路径,读图抓住颜色语义:红色是入口现象,蓝色是排查动作,中性灰核实安装事实,橙色是修复执行,绿色是收尾复验。
读图抓住主干:先证可见性,PATH 里没有再去核实安装;确认装了之后修变量、加载 module,而不是直接重装。「交互行、脚本里不行」是独立支线,直接走向脚本自包含环境,不要在登录配置文件里纠缠。
第三步处理非登录 shell:CI、cron、远程命令是最严苛的环境。 ssh host calibre -drc runset.drc 走 non-login non-interactive shell,.bashrc、.bash_profile 都不一定读;CI runner 和 cron 作业的 PATH 往往是系统最小集。判别不猜,用最小环境在本机复现失败现场,再让失败作业自己打印环境:
env -i bash -lc 'echo $PATH; which calibre'env -i 清空一切变量后起登录 shell,复现出来就是作业节点的真实状态。根治办法是作业脚本自包含环境:首行 source 站点环境脚本或写明 module load,再打印一行 PATH 留痕,不假设调度器替你继承桌面环境:
#!/bin/bash
source /tools/mentor/calibre_setup.sh # 或 module load calibre/2023.4,二选一不重复
echo "PATH=$PATH CALIBRE_HOME=$CALIBRE_HOME"
calibre -drc runset.drc第四步用 which -a 治多版本并存。 一个节点上常有三五个 Calibre 版本,多个 bin 都被前置到 PATH 时,第一个命中的就是实际跑的,未必是你以为的新版。which -a calibre 列出全部命中项,顺序与 PATH 一致;正解是版本切换一律走 module,禁止在 .bashrc 里堆一串 export 试图「全都能用」——人脑记不住当前会话 export 的是谁。团队脚本里曾经写死的个人全路径(如 /tools/mentor/calibre/<旧版>/bin/calibre)也要 grep 清掉,改用变量锚定。
第五步分流「找到了但跑不起来」,这不是 PATH 问题。 which 看得到、执行却 Permission denied,用 ls -l 看 wrapper 是否缺执行权限(chmod +x 即可),或文件系统是否以 noexec 挂载(找管理员);全路径执行报 No such file 而文件明明在,用 file bin/calibre 看架构——32/64 位子目录拿错、脚本首行解释器不存在都是这个文案。启动后报 Unable to checkout a license、连不上 license server,是授权问题,处置见 Calibre license 取不出来;报 rule deck、INCLUDE、cell 找不到,则转 Calibre 模块/单元找不到。第一刀永远切在 which -a 的成败上,三类错别混着治。
四、预防与纪律
- 环境收口到一个脚本:全组统一 source 一个环境脚本(安装根、PATH、
MGLS_LICENSE_FILE、库路径一次设全),版本升级只改一处,个人.bashrc与作业脚本都只引用它。 - 多版本用 module 管理,禁止手工调 PATH 顺序切版本;工程脚本禁止写死
/tools/mentor/calibre/<ver>个人全路径。 - 作业脚本必须自包含:CI、cron、SSH 远程调用一律首行 source 或 module load,并打印 PATH 与安装根留痕,不假设任何默认环境。
- 装完即验证:新节点或升级后先跑绝对路径
.../bin/calibre -version,再跑which -a calibre,把「装好了」和「当前 shell 能用」分开验证。 - 排查口令留给新人:
which -a看可见性与命中顺序、echo $PATH看搜索域、ls $CALIBRE_HOME/bin看安装事实——八成 command not found 到此结束。
这一篇在知识体系里的位置
本篇是 EDA 排错速查簇中「Calibre 工具启动」节点的 FAQ 页,处在物理验证链路最前端:命令找不到,license、rule deck、DRC/LVS/PEX 都无从谈起。过了启动这一关,第二道坎是 Calibre license 取不出来,工具内文件与层次问题见 Calibre 模块/单元找不到,正常启动后的完整验证流程见 Calibre 物理验证实操,全簇索引在 开源/EDA 工具报错排查总览。
一句话总结
Calibre 报 command not found 时,先用 which -a、echo $PATH、ls 安装根分清是没装还是找不到:装了就核对 CALIBRE_HOME/MGC_HOME 指向并 source 站点环境脚本(license 变量配对不等于二进制在 PATH),有 module 的站点直接 module load calibre/<版本>;交互行而 CI、cron、SSH 作业不行,用 env -i 复现并让脚本首行自包含环境;多版本并存看 which -a 的命中顺序并把切版本交给 module,Permission denied 查 wrapper 权限、全路径 No such file 查平台子目录——九成情况不需要重装任何东西。