命名不明确的可执行文件

命名不明确的可执行文件

看来,tcsh如果我在两个单独的文件夹中命名不明确的可执行文件,$PATH它会定向到最近创建的文件夹中的可执行文件。我对么?这总是正确的吗?

答案1

一般来说,它将是它被发现的顺序,$PATH因为这是 的预期用途$PATH

此规则可能有一个例外,但这需要使用软件中命令的目录对该命令进行硬编码。但我会认为这种做法不好。

答案2

同一目录中不能有两个同名的文件。如果有多个版本prog,则有一个版本,例如 in/usr/bin和另一个版本/usr/local/binPATH环境变量决定选择哪一个版本。这是由exec(3)查看PATH(最有可能)的家族之一完成的execvp(3),shell 在这里没有发言权。

答案3

在 Solaris 中,通常有两个目录(实际上不止两个)包含同名程序的不同版本。一个例子可以在和ps中找到。如果 和 都出现在您的 中,则执行的版本是您的 中第一个出现的版本。/usr/ucb/usr/bin/usr/ucb/usr/binPATHpsPATH

答案4

所有 shell 按顺序遍历目录$PATH,并执行它们找到的第一个命令。例如,如果你的路径是,那么如果有则执行/usr/local/bin:/usr/bin:/binfrom 的命令;/usr/local/bin如果不存在,则执行来自的命令/usr/bin,依此类推。命令的安装顺序并不重要。

有一个例外:如果您在 shell 已经运行时安装程序,则 shell 可能会将程序的位置保留在缓存中,在这种情况下,它将继续执行旧程序。例如,如果您启动 tcsh,然后您foo在此时运行 which /usr/bin/foo,然后您安装该程序的另一个版本/usr/local/bin/foo并再次从该 shell 调用foo,它仍然会运行/usr/bin/foo。新启动的 shell 将启动/usr/local/bin/foo。运行命令rehash以清空 tcsh 的命令位置缓存。在bash和zsh中,等效的命令是hash -r(zsh也理解rehash)。

相关内容