如何找出 unix 命令执行的位置?

How to find out the location where a unix command executes from?

有什么方法或命令可以找出执行标准命令的路径吗?示例 lsmkdirmysqlhadoop 等。

我知道它们的来源可以从$PATH 变量中找到,并且应该在/bin 目录之一中。但是如何从命令运行的地方正确获取目录?

which 命令 returns 可执行文件的完整路径,例如:

mureinik@comupter ~ $ which mkdir
/usr/bin/mkdir

如果您确实需要该目录,您可以随时对其应用 dirname

mureinik@conmputer ~ $ dirname `which mkdir`
/usr/bin

阅读 OP 的问题,我注意到有针对性地排除了依赖 PATH 的方法,并忽略了 which 的明显答案(因为这正是它所做的)。顺便说一下,which 程序最初是一个 C-shell 脚本,尽管还有其他实现(FreeBSD, and bash for instance). Solaris, for instance, has a version little changed from 4.2BSD,其手册页指出

Both aliases and path are taken from the user's .cshrc file.

如果您不使用 C-shell,则 which 的原始版本的用处有限。因为没有标准版本,结果(和工具的功能)可能因系统而异。某些 shell(例如 ksh)具有相似的特征,但名称不同,例如 whenceksh 的情况下(bash 提供 ksh 别名type 但不是 `whence 关键字)。

我不经常使用 which,有更好的工具 (conflict and path)。但是忽略了显而易见的问题,措辞上的问题很容易提出一个更有趣的问题:一个应用程序如何确定另一个应用程序所在的目录 运行。不是显而易见的 "where is the executable?",而是 "what was the working directory when the program was run?"。最近有一个类似的问题涉及相对路径名。

在某些支持 /proc 伪文件系统的系统上,有一个 cwd 节点给出给定进程的当前工作目录。问题 Find out current working directory of a running process? 对此进行了详细说明。

xterm 的可选功能 "spawn-new-terminal"(2007 年在 patch #225 中添加)使用此信息在与用户当前 [=40] 相同的工作目录中创建一个新的终端实例 运行 =]shell 工作目录.

脚本可以通过从相关命令的进程 ID 开始并检查 /proc 树中相应的 cwd 节点来使用它。