観察する: /b/foo に foo という実行ファイルがあります。動的ライブラリの古いヘッダーに対してコンパイルされ、実行時にセグフォルトが発生しました。
$ foo
Segmentation fault. // Expected behaviour.
これで、新しい動的ライブラリに基づいて新しいfooのバージョンを/a/fooにコンパイルします。これは正常に実行されます。 a/ ディレクトリは $PATH の b/ の前にあるので、/a/foo を選択する必要があります。
$ which foo
/a/foo
fooを実行すると、次のことが起こります。
$ foo
Segmentation fault.
したがって、/b/fooが実行されているように見えますが、「which」は/a/fooを実行する必要があることを示します。もう1つのことは、フルパス$(which /a/foo)を実行すると、すべてがうまく機能することです。
$ /a/foo
OK!
$ cp /a/foo .
$ ./foo
OK!
もう一歩進んで/a/fooを削除すると、次のようになります。
$ rm /a/foo
それから/ b / fooでなければなりません。そうですか?
$ which foo
/b/foo
$ foo
bash: /a/foo: No such file or directory
$ $(which foo)
Segmentation fault. // Expected result.
いいえ!
問題を解決してください: ソース.bash_profileと.bashrcの問題は消えます。
再現性: 毎回。 /a/foo を削除して ~/.bash_profile をソースにし、/a/foo を生成すると、上記の観察内容が再び表示されます。
質問: ここで何が起こっているのか知っている人はいますか?
仮定: 「ある」が最新ですが、システムは「過去の状況」に基づいて選択します。上記の例で端末を開くと、/a/foo はまだ存在しません。先ほど作成しました。それでは、/a/fooが生成されたら、「どれ」が/a/fooを検出しますが、システムがまだ同期していないため、/b/fooを選択しますか? しかし、なぜシステムが同期しないのですか?
答え1
Bashがコマンドをキャッシュする場所。hash foo
キャッシュを強制的に更新するために使用されます。
また、which
これは単一のコマンドなので、シェルが実際にどこを探しているのかを知らせずに、$PATH
環境変数を照会します。 Bashでは、次のものを使用する必要がありますtype
。
$ type foo
foo is hashed (/a/foo)