{"id":249,"date":"2007-09-13T18:39:50","date_gmt":"2007-09-13T16:39:50","guid":{"rendered":"http:\/\/www.lucas-nussbaum.net\/blog\/?p=249"},"modified":"2007-09-13T21:08:07","modified_gmt":"2007-09-13T19:08:07","slug":"subject-re-bash-la-commande-hash-r","status":"publish","type":"post","link":"https:\/\/www.lucas-nussbaum.net\/blog\/?p=249","title":{"rendered":"Re: Bash: la commande hash -r"},"content":{"rendered":"<p>Je r\u00c3\u00a9ponds ici \u00c3\u00a0 <a href=\"http:\/\/alban.apinc.org\/blog\/index.php\/2007\/09\/12\/89-bash-la-commande-hash-r\">un billet d&#8217;Alban sur la commande hash -r<\/a> de bash. Lisez son billet avant pour comprendre ma r\u00c3\u00a9ponse !<\/p>\n<p>bash et tcsh g\u00c3\u00a8rent le $PATH d&#8217;une mani\u00c3\u00a8re diff\u00c3\u00a9rente.<\/p>\n<p>\u00c3\u20ac chaque commande ex\u00c3\u00a9cut\u00c3\u00a9e, bash parcourt les r\u00c3\u00a9pertoires du $PATH \u00c3\u00a0 la recherche de la commande, et garde un cache des commandes d\u00c3\u00a9j\u00c3\u00a0 ex\u00c3\u00a9cut\u00c3\u00a9es pour ne pas faire cette recherche \u00c3\u00a0 chaque fois.<\/p>\n<p>tcsh parcourt les r\u00c3\u00a9pertoires \u00c3\u00a0 son lancement, et construit un cache de toutes les commandes possibles (on le voit avec strace, avec la s\u00c3\u00a9rie d&#8217;appels \u00c3\u00a0 getdents() au lancement).<\/p>\n<p>Dans bash, hash -r provoque la remise \u00c3\u00a0 z\u00c3\u00a9ro du cache.<\/p>\n<p>Dans tcsh, rehash provoque le re-parcours des r\u00c3\u00a9pertoires du $PATH.<\/p>\n<p>Que se passe-t-il quand on ajoute une commande dans le $PATH ? Avec bash, rien. Les r\u00c3\u00a9pertoires vont \u00c3\u00aatre parcourus \u00c3\u00a0 la premi\u00c3\u00a8re ex\u00c3\u00a9cution de cette commande. Avec tcsh, c&#8217;est le processus fils qui va faire des execve sur \/usr\/local\/bin\/toto, \/usr\/bin\/toto, \/bin\/toto, \/usr\/bin\/X11\/toto etc jusqu&#8217;\u00c3\u00a0 ce que l&#8217;execve n&#8217;\u00c3\u00a9choue pas (attention, il faut lancer strace avec -f pour le voir). Mais comme c&#8217;est le processus fils du shell qui les fait, il n&#8217;enrichit pas le cache (qui est dans le p\u00c3\u00a8re) ! Donc \u00c3\u00a0 chaque fois qu&#8217;on ex\u00c3\u00a9cute une commande qui n&#8217;\u00c3\u00a9tait pas l\u00c3\u00a0 au lancement du shell, il re-teste tous les r\u00c3\u00a9pertoires.<\/p>\n<p>Que se passe-t-il quand on ajoute un r\u00c3\u00a9pertoire dans le $PATH ? Avec bash, rien. Le r\u00c3\u00a9pertoire sera juste parcouru avec les autres. Avec tcsh, par contre, tous les r\u00c3\u00a9pertoires du $PATH sont re-parcourus pour mettre \u00c3\u00a0 jour le cache.<\/p>\n<p>Il me semble que le comportement de tcsh a chang\u00c3\u00a9. Quand je l&#8217;utilisais sous FreeBSD il y a 6 ou 7 ans, tcsh ne faisait pas cette recherche dans tous les r\u00c3\u00a9pertoires du $PATH quand une commande inconnue \u00c3\u00a9tait ex\u00c3\u00a9cut\u00c3\u00a9e. Du coup, rehash \u00c3\u00a9tait tr\u00c3\u00a8s fr\u00c3\u00a9quemment utilis\u00c3\u00a9, par exemple apr\u00c3\u00a8s avoir install\u00c3\u00a9 une appli.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je r\u00c3\u00a9ponds ici \u00c3\u00a0 un billet d&#8217;Alban sur la commande hash -r de bash. Lisez son billet avant pour comprendre ma r\u00c3\u00a9ponse ! bash et tcsh g\u00c3\u00a8rent le $PATH d&#8217;une mani\u00c3\u00a8re diff\u00c3\u00a9rente. \u00c3\u20ac chaque commande ex\u00c3\u00a9cut\u00c3\u00a9e, bash parcourt les r\u00c3\u00a9pertoires du $PATH \u00c3\u00a0 la recherche de la commande, et garde un cache des commandes d\u00c3\u00a9j\u00c3\u00a0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"0","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,7],"tags":[],"class_list":["post-249","post","type-post","status-publish","format-standard","hentry","category-debianubuntu","category-technology"],"_links":{"self":[{"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=\/wp\/v2\/posts\/249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=249"}],"version-history":[{"count":0,"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lucas-nussbaum.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}