在 bash 中,如何设置路径,以便它在最近的相对路径中找到命令的版本?

在 bash 中,如何设置路径,以便它在最近的相对路径中找到命令的版本?

我的机器上有多个 git 存储库。每个都有一个名为 script/ 的子目录,其中包含一个名为 cleancode.py 的脚本。

使用bash(实际上是git-bash),当我运行cleancode.py时,我希望它从我当前工作目录所在的存储库的scripts/目录中执行cleancode.py的实例。我目前的黑客方法是在我的路径中包含以下内容:

export PATH="$PATH:./scripts:./../scripts:./../../scripts:./../../../scripts:"

这效果还算不错。我想如果我所在的子目录深度超过三层,它可能会失败,但这在实践中不是问题。真正的问题是,我第一次运行 cleancode.py 时,它似乎记住了该执行的相对路径,并且将来只在该相对路径中查找 cleancode.py 。因此,如果我首先从 repo 目录运行,那么它就可以工作,然后如果我 cd 到某个子目录并再次运行它,我会得到:

bash: ./scripts/cleancode.py: No such file or directory

因为它使用的是相对于我第一次运行它的位置找到它的路径。那么我该怎么做才能让它不记得最后在哪里找到脚本呢?或者我可以让它记住绝对路径,而不是相对路径吗?最后,是否有一种更强大的方法来处理整个问题,而不依赖于向我的路径添加四个相对路径?提前致谢。

编辑:我刚刚发现禁用路径中 bash 的可执行文件缓存set +h 修复了我的 hack 中的缺陷。不过,我的实际问题仍然存在:在最近的相对路径中查找命令版本的最可靠方法是什么?

答案1

您可以cleancode在您的shell 脚本中创建一个 shell 脚本PATH并执行类似的操作:

#!/bin/bash

cwd=$PWD

while [ "x$cwd" != x/ ]; do
    if [ -e $cwd/scripts/cleancode.py ]; then
        # do stuff here
        break
    fi
    cwd=`dirname $cwd`
done

请注意,/由于之前循环已中断,因此不会检查目录。

相关内容