2010-11-26 38 views
0

本当に奇妙な問題に直面しています。問題:Unixで正しい実行可能ファイルを実行できません。

私は実行可能ファイルをコンパイルし、cpを特定の場所に持っています。この実行可能ファイルの名前は "qact"です。main関数の最初の行に、新たに追加されたcout文があります。しかし、私はそのディレクトリ内のバイナリファイルを実行すると、私はそれを見ることができません。長い間、私が間違ってそのディレクトリにいなければ、実行時に出力された文字列を見ることができます。

そして、私はそのディレクトリにいるときに実行されたバイナリファイルが間違っていて、文字列が表示されないことがわかりました。

この実行可能ファイルを使用すると、私がどのディレクトリにいるのかわからないので、いつも同じ結果が得られ、正しい場所です。本当に混乱

...

+0

実行ファイルの名前は何ですか?それがa.outであると仮定し、pwd && ./a.outの出力は何ですか? (./はPATHの問題ではないことを確認するために重要です) –

+0

この実行ファイルの名前は "qact" – Johnyy

答えて

2

はあなた$PATHの他の場所に同じ名前の別の実行可能ファイルを持っていますか?その場合、bashはハッシュテーブルを使用して余分な$PATHルックアップ(Command Search and Execution参照)を避けるため、間違った実行可能ファイルを実行している可能性があります。

たとえば、$PATH/opt/local/bin:/usr/binで、grep/usr/binにのみインストールされているとします。今

$ echo $PATH 
/opt/local/bin:/usr/bin 
$ which grep 
/usr/bin/grep 
$ grep --version 
grep (GNU grep) 2.5.1 

を、あなたの$PATH/usr/binより早いである、/opt/local/bingrepの新しいバージョンをインストールしているとします。あなたはgrepを実行すると、あなたは明白な結果を得ます。 whichは常にフル$PATH検索を毎回行いますが、bashはハッシュテーブルを保持しているため、bashはまだコマンドそのgrepマップ/usr/binの1に考えて:あなたは、この問題を診断するためにtype builtinを使用することができます

$ which grep 
/opt/local/bin/grep 
$ grep --version 
grep (GNU grep) 2.5.1 
$ /opt/local/bin/grep --version 
GNU grep 2.6.3 

typeは、コマンドがシェル組み込み関数、別名、関数、キーワード、または実行可能ファイルのいずれであるかを示します。後者の場合は、実行可能ファイルへの完全なパスが表示されます。

$ type grep 
grep is hashed (/usr/bin/grep) 

これをどのように修正しますか? hash組み込み関数を使用すると、ハッシュテーブルを操作できます(詳細については、help hashを入力してください)。 1つのエントリ(この場合はgrep)を修正したい場合はhash -d grepに「grepのハッシュテーブルエントリを削除する」と答えることができます。この場合、次にgrepを実行すると、期待通りに$PATHが検索されます。たとえば、新しいソフトウェアを大量にインストールした場合や$PATHを変更した場合など、ハッシュテーブル全体を消去する場合は、hash -rを使用して空にします。

+0

ありがとうございます。私は "ハッシュ"を試したとき、ハッシュテーブルが空であると言います。私がそれを「タイプ」すると、正しい場所が表示されます。はい、この実行可能ファイルの他の多くのバージョンがあります。私はちょうど何かを試しました。 PATH = "<正しいパス>"となり、他のパスは存在しません。そしてそれはまだ私に同じことをしています。 – Johnyy

+0

私はまた別のシェル、bash、kshで実行しようとしました。 – Johnyy

+0

私は、シェルがコマンドを記憶してハッシュに入れるときに、シェルにコマンドを入力した後であることを理解しています。しかし、それは正しい道です。 – Johnyy