博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

理解 shell 中查找可执行文件的命令:which、where 与 command

本教程详细讲解了 Unix-like 系统(重点是 macOS 默认的 zsh shell)中三个常用命令:whichwherecommand,它们用于定位可执行文件、函数或别名。
我们会结合一个真实案例——在 macOS 上使用 PyCharm 2025 创建 Conda 项目时遇到的路径问题(PyCharm 报错 /root/miniconda3/bin/conda 不存在),来解释这些命令的实际应用。

通过掌握这些命令,您可以快速诊断环境变量、Conda 包装函数等问题,帮助 PyCharm 正确识别 Conda 可执行文件路径(如 /opt/anaconda3/condabin/conda)。

前置知识

  • 本文假设您使用 zsh(macOS Catalina 及以后默认 shell)。bash 的行为略有不同。
  • 需要已安装 Anaconda 或 Miniconda。
  • 在 Terminal.app 或 iTerm2 中执行命令。
  • 当前日期参考:2026 年 1 月(PyCharm 2025.x 版本常见问题)

1. which 命令

概述

which 在您的 $PATH 中查找第一个匹配的可执行文件。它简单直接,但在 zsh 中如果存在同名的 shell 函数或别名,which 会优先显示函数定义,而不是文件路径。

用法

  • 基本语法:which [选项] 命令名
  • 常用选项:
    • -a:显示 PATH 中所有匹配项(而非仅第一个)。

示例

which python3          # 可能输出 /opt/anaconda3/bin/python3
/opt/anaconda3/bin/python3

which -a python3       # 列出系统中所有 python 可执行文件路径
/opt/anaconda3/bin/python3
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3
/Library/Frameworks/Python.framework/Versions/3.12/bin/python3
/usr/local/bin/python3
/usr/bin/python3

实际案例:PyCharm + Conda 问题

在 PyCharm 2025 新建 Conda 项目时,如果报错“Cannot run program /root/miniconda3/bin/conda: No such file or directory”,您在终端运行:

which conda

输出可能是这样的函数定义(而非路径):

conda () {
    \local cmd="${1-__missing__}"
    case "$cmd" in
        (activate | deactivate) __conda_activate "$@" ;;
        (install | update | upgrade | remove | uninstall) __conda_exe "$@" || \return
            __conda_activate reactivate ;;
        (*) __conda_exe "$@" ;;
    esac
}

原因:Conda 在 conda init zsh 时向 ~/.zshrc 注入了这个函数,用于高效处理 activate/deactivate 和动态 PATH 修改。
which 优先显示函数,所以无法直接得到真实的可执行文件路径。

# 通过 which -a 查看输出结果
which -a conda

conda () {
	\local cmd="${1-__missing__}"
	case "$cmd" in
		(activate | deactivate) __conda_activate "$@" ;;
		(install | update | upgrade | remove | uninstall) __conda_exe "$@" || \return
			__conda_activate reactivate ;;
		(*) __conda_exe "$@" ;;
	esac
}
/opt/anaconda3/condabin/conda

优缺点

  • 优点:简单快速,适合普通查找。
  • 缺点:在 zsh + Conda 环境下常只显示函数定义,不够全面。

2. where 命令

概述

where 是 zsh 特有的命令,相当于增强版的 which -a。它会列出所有可能的匹配项,按优先级顺序显示,包括:shell 函数、别名、内置命令、PATH 中的可执行文件。

用法

  • 基本语法:where [选项] 命令名
  • 通常直接使用,不加选项即可获得完整信息。

示例

where ls          # 可能先显示别名,再显示 /bin/ls
ls: aliased to ls -G
/bin/ls

实际案例:PyCharm + Conda 问题

在您的 Conda 环境中运行:

where conda

输出示例:

conda () {
    \local cmd="${1-__missing__}"
    case "$cmd" in
        (activate | deactivate) __conda_activate "$@" ;;
        (install | update | upgrade | remove | uninstall) __conda_exe "$@" || \return
            __conda_activate reactivate ;;
        (*) __conda_exe "$@" ;;
    esac
}
/opt/anaconda3/condabin/conda

这里清晰地显示了两部分:

  1. Conda 的 shell 函数(来自 ~/.zshrc)
  2. 真正的 conda 可执行文件路径:/opt/anaconda3/condabin/conda

解决 PyCharm 问题:直接把 /opt/anaconda3/condabin/conda 粘贴到 PyCharm 的“Path to conda”输入框中,错误立即消失,Create 按钮变为可用。

优缺点

  • 优点:最全面,能一次性看到函数 + 文件路径。
  • 缺点:仅限 zsh(bash 中用 type -a 替代)。

3. command 命令

概述

command 是 shell 内置命令,用于绕过别名和函数直接执行或查找命令。搭配 -v-V 选项时,可用来定位真实路径,非常适合脚本和调试。

用法

  • 基本语法:command [选项] 命令名 [参数]
  • 定位相关选项:
    • -v:显示命令类型和路径(推荐)。
    • -V:更详细的描述。
  • 绕过函数执行:command ls(忽略任何 ls 的别名或函数)。

示例

command -v echo       # 输出 /bin/echo,绕过可能的函数
command git status    # 直接运行原始 git 命令

实际案例:PyCharm + Conda 问题

想要最快得到 Conda 的真实可执行路径,直接运行:

command which conda
# 输出
/opt/anaconda3/bin/conda

输出:/opt/anaconda3/bin/conda
这比 where 更简洁,只显示文件路径。
在 PyCharm 中直接填入此路径,即可解决“Cannot run program”错误。

优缺点

  • 优点:绕过包装层,跨 shell 兼容性好。
  • 缺点:默认不显示所有匹配项(需加 -a 在某些 shell 中)。

快速对比表

命令 主要输出内容 是否显示函数 是否显示所有匹配 推荐场景
which conda 通常只显示函数定义 简单查找(但 Conda 常失效)
where conda 函数定义 + 文件路径 全面诊断 Conda 问题(最推荐)
command which conda 直接显示真实可执行文件路径 快速获取 PyCharm 所需路径
type -a conda 类似 where,显示类型 + 路径 bash/zsh 通用替代

额外实用技巧

  • 想绕过一切干扰找路径:优先用 command which condawhere conda
  • Conda 函数不要删除:它是官方设计,用于优化环境激活,删掉会导致 conda activate 失效。
  • PyCharm 2025 修复流程总结:
    1. 终端运行 command which condawhere conda 获取路径
    2. 新建项目 → Pure Python → Path to conda → 粘贴路径
    3. 若仍失败:先创建空项目 → Settings → Python Interpreter → Add → Conda Environment → Existing environment
  • 检查 Conda 初始化代码:cat ~/.zshrc | grep conda(应看到 conda init 块)

总结

在 macOS + Conda + PyCharm 的环境中,which 常被函数“欺骗”,而 wherecommand -v 才是真正帮您找到可执行文件路径的利器。
熟练使用它们,不仅能快速解决 IDE 配置问题,还能深入理解 shell 的命令解析优先级。

更多参考:

  • man whichman zshbuiltins
  • Conda 官方文档:Shell initialization