Linux / bashが「これは」実行可能ファイルを実行しないことを知らせる[重複]

Linux / bashが「これは」実行可能ファイルを実行しないことを知らせる[重複]

観察する: /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)

関連情報