2010-11-26 7 views
0

Je rencontre un problème vraiment étrange, toute aide est appréciée.Problème: Impossible d'exécuter le bon fichier exécutable sous Unix

J'ai un fichier exécutable compilé et cp à un emplacement spécifique. Le nom de cet exécutable est "qact". Il y a une nouvelle déclaration cout ajoutée à la première ligne de la fonction principale. Mais quand j'exécute le fichier binaire dans ce répertoire, je ne le vois pas. Après un long moment, je découvre accidentellement que si je ne suis pas dans ce répertoire, je peux voir la chaîne sortie quand je l'exécute.

Et plus tard, je découvre que c'est seulement quand je suis dans ce répertoire, le fichier binaire exécuté est faux et je ne verrai pas la chaîne. Quand j'utilise qui sur cet exécutable, quel que soit le répertoire dans lequel je suis, j'obtiens toujours le même résultat et c'est l'emplacement correct.

vraiment confus ..

+0

Quel est le nom de l'exécutable? En supposant que c'est a.out, quelle est la sortie de pwd && ./a.out. (./ est important pour s'assurer que ce n'est pas un problème PATH) –

+0

le nom de cet exécutable est "qact" – Johnyy

Répondre

2

Avez-vous un autre fichier exécutable du même nom ailleurs dans votre $PATH? Si c'est le cas, il est possible que bash exécute le mauvais exécutable car il utilise une table de hachage pour éviter les recherches supplémentaires (voir Command Search and Execution). Par exemple, supposons que votre $PATH soit /opt/local/bin:/usr/bin et que grep soit installé dans /usr/bin. Lorsque vous exécutez grep, vous obtenez le résultat évident:

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

Supposons maintenant que vous installez une version plus récente de grep dans /opt/local/bin, qui est plus tôt dans votre $PATH que /usr/bin. Parce que which fait toujours la pleine $PATH recherche chaque fois, mais bash conserve une table de hachage, bash pense toujours que la commande grep cartes à celui /usr/bin:

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

Vous pouvez utiliser le type builtin pour diagnostiquer ce problème. type vous dira si une commande est un shell intégré, un alias, une fonction, un mot-clé ou un fichier exécutable. Si ce dernier, il vous indique le chemin d'accès complet à l'exécutable:

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

Alors, comment vous résoudre ce problème? Vous pouvez utiliser le code interne hash pour manipuler la table de hachage (tapez help hash pour plus d'informations). Si vous voulez juste corriger une entrée (grep dans ce cas), vous pouvez faire hash -d grep pour dire "supprimer l'entrée de table de hachage pour grep", auquel cas la prochaine fois que vous exécuterez grep, il recherchera le $PATH comme prévu. Si vous voulez effacer toute la table de hachage (par exemple, si vous venez d'installer une grande quantité de nouveaux logiciels ou si vous avez changé votre $PATH), utilisez hash -r pour le vider.

+0

Merci pour l'information. Quand j'ai essayé "hash", il dit que la table de hachage est vide. Quand je le "tape", il indique l'emplacement correct. Oui, il existe de nombreuses autres versions de cet exécutable. J'ai juste essayé autre chose. PATH = "", de sorte qu'aucun autre chemin n'existe. Et ça me fait toujours la même chose. – Johnyy

+0

J'ai aussi essayé d'exécuter dans différents shells, bash, ksh. – Johnyy

+0

Je comprends juste que c'est après que je tape la commande dans le shell lorsque le shell se souvient de la commande et les met dans le hachage. Mais c'est le bon chemin. – Johnyy