Existe-t-il une commande pour que csh relise tous les répertoires de votre chemin sous FreeBSD?

2

Je rencontre un problème étrange dans FreeBSD9 en cshtant que shell. Les programmes nouvellement installés qui se trouvent sur mon chemin ne se lanceront que si je relance le cshshell. Je trouve cela vraiment énervant.

Je suppose que cshrecherche des chemins une fois et ne pas les rechercher jusqu'à ce que vous le quittiez. Comment l'obligez-vous à se mettre à jour? Y a-t-il quelque chose que vous pouvez mettre dans le .cshrcpour que cela cesse? (Je suis habitué à bash, et je ne vois rien de pareil à bash.)

Warren P
la source

Réponses:

4

Le shell C Unix hache vos répertoires de chemin de recherche pour l'aider à trouver plus rapidement les exécutables. Mais il crée des angles morts si vous ajoutez de nouveaux exécutables à ces répertoires après avoir déjà fait son hash. La solution consiste à utiliser la rehashcommande pour lui dire de reconstruire son hachage. Alternativement, vous pouvez désactiver complètement le hachage du chemin (en prenant un léger impact sur les performances) à l'aide de la unhashcommande.

(Fwiw, je conviens que c'est un comportement gênant. J'utilise un hachage de chemin dans mon propre shell C d'Hamilton , mais le mien est assez intelligent pour découvrir des angles morts et les réparer automatiquement.)

Nicole Hamilton
la source
Cela me surprend que chaque instance de la coquille a son propre hash. Je suppose que chaque shell PEUT avoir son propre chemin, même si le même fichier .cshrc a créé le chemin initial, donc je suppose que c'est inévitable.
Warren P
Le hachage est créé en mémoire par chaque instance du shell C lors de l'analyse des répertoires de chemins. N'oubliez pas que chaque processus reçoit sa propre copie des variables d'environnement (y compris PATH) et peut les modifier sans affecter les autres processus.
Nicole Hamilton
Je me souviens d'avoir lu un article sur votre shell dans DDJ, au début des années 90. Je pense que c'était celui-ci: drdobbs.com/cpp/examining-the-hamilton-c-shell/184408480 OS / 2 ... Wow. Souvenirs.
Warren P
Yup, c'est ma coquille C J'avais un prénom différent à l'époque mais c'est moi. Qui savait que 25 ans plus tard, j'y travaillerais encore, ajoutant toujours des fonctionnalités et un support pour les nouvelles versions de Windows.
Nicole Hamilton
Agréable! J'ai essayé la version de démonstration x64 sur Win8 RTM tout à l'heure. Je suis heureux d'annoncer qu'il semble fonctionner correctement. Quelques commentaires: le fait d'avoir "man" lors de l'exécution dans cet environnement me manque. Je ne peux pas aller loin dans des environnements shell de type BSD sans homme. Et chut. Et ce thermos et ce jeu de paddle-ball. Et c'est tout ce dont j'ai besoin. :-)
Warren P
1

Si vous utilisez une version actuelle de tcsh(je l’ai déjà tcsh 6.20.00 (Astron) 2016-11-24), vous pouvez set autorehash(par exemple, dans votre ~/.cshrcou à l’invite) activer automatiquement la réanalyse des répertoires `path 'si nécessaire (comme bash). Par la page de manuel de tcsh:

  autorehash (+)
     If set, the internal hash table of the contents of the directories in the
     path variable will be recomputed if a command is not found in the hash table.  
     In addition, the list of available commands will be rebuilt for each command
     completion or spelling correction attempt if set to `complete' or `correct' 
     respectively;  if set to `always', this will be done for both cases.

Cependant, il existe quelques cas limites, comme indiqué dans la rehashsection commande de la page de manuel tcsh:

rehash  Causes the internal hash table of the contents of the directories
        in the path variable to be recomputed.
        ...
        With autorehash, a new command will be found automatically, except
        in the special case where another command of the same name
        which is located in a different directory already exists in the
        hash table.  Also flushes the cache of home  directories built
        by tilde expansion.
N. Ngo
la source