Bashで最も近い相対パスでコマンドバージョンを見つけるためにどのようにパスを設定しますか?

Bashで最も近い相対パスでコマンドバージョンを見つけるためにどのようにパスを設定しますか?

私のコンピュータには複数のGitリポジトリがあります。それぞれに、cleancode.pyというスクリプトを含むscript /というサブディレクトリがあります。

bash(実際にはgit-bash)を使用してcleancode.pyを実行するときは、現在の作業ディレクトリがあるリポジトリのscripts /ディレクトリからcleancode.pyインスタンスを実行したいと思います。私の現在のハッキングは、私のパスに次のものを含めることです。

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

この効果は悪くありません。私が持っているサブディレクトリの深さがステップ3を超えると失敗する可能性がありますが、実際には問題にはなりません。実際の問題は、cleancode.pyを初めて実行したときにその実行の相対パスを覚えておくと、後でその相対パスでのみcleancode.pyを探しているようです。したがって、最初にrepoディレクトリで実行すると機能します。その後、いくつかのサブディレクトリに移動して再実行すると、次のような結果が得られます。

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

これは、最初に実行した場所に基づいて見つかったパスを使用するためです。それでは、スクリプトを最後に見つけた場所を覚えていないようにするにはどうすればよいですか?それとも、相対パスの代わりに絶対パスを覚えておくことができますか?最後に、私のパスに4つの相対パスを追加することに頼らずに問題全体を処理するより強力な方法はありますか?よろしくお願いします。

編集:ちょうど見つけましたパスで bash 実行可能ファイルのキャッシュを無効にします。set + hは私のハッキングの欠陥を修正しました。しかし、実際の質問はまだ残っています。最も近い相対パスでコマンドバージョンを見つける最も安定した方法は何ですか?

ベストアンサー1

cleancodeシェルスクリプト内でシェルスクリプトを作成し、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

ループが以前に中断されたため、/ディレクトリはチェックされません。

おすすめ記事