Si je démarre emacs 24.5.2 avec emacs -Q
et fais M-x eshell
, exécutez:
$ which rm
eshell/rm is a compiled Lisp function in `em-unix.el'
J'obtiens la version eshell. Mais si je C-h v eshell-prefer-lisp-functions
vois, la valeur est nulle. Pourtant, la documentation indique:
Si vous préférez utiliser les commandes intégrées au lieu des commandes externes, définissez eshell-prefer-lisp-functions sur t.
Est-ce un bug? Je pensais que les documents pourraient être à l'envers, j'ai donc essayé de définir la variable sur t
, mais le comportement reste le même, je continue à obtenir l'implémentation eshell plutôt que la version dans / bin.
which
. Si vous le faitesrm --version
, qu'obtenez-vous?$ *rm filename
. Le démarrage*
feraeshell
sauter la recherche de commandes intégrées. Cette méthode est utile pour contourner les commandes intégrées, quels que soient les paramètres préférés.Réponses:
Eshell préfère toujours les fonctions Lisp.
eshell-prefer-lisp-functions
affecte uniquement l'interprétation de*rm
, pas l'interprétation derm
.Source: le code source… D'après Emacs 24.3:
eshell-find-alias-function
recherche une fonction sous leeshell/
préfixe. Il y a une logique similaireeshell/which
.La documentation de la variable est carrément trompeuse, et le manuel est également assez trompeur. Je suppose que le comportement est de par leur conception (après tout, pourquoi définiriez-vous une fonction eshell si ce n'est pas pour l'utiliser?), C'est donc un bug de documentation.
Pour appeler l'utilitaire externe, appelez
/bin/rm
ou, à condition que vous ayez laisséeshell-prefer-lisp-functions
la valeur nulle, appelez*rm*
. Si vous souhaitezrm
toujours invoquer l'utilitaire externe, vous pouvez définir un alias:alias rm "rm $*"
(merci GDP2 ).la source
rm
toujours invoquer la commande externe est de s'assurer qu'aucune fonction n'est appeléeeshell/rm
. (Cela, ou bien sûr de conseiller ou de redéfinir une partie du code d'Eshell.)" Ce n'est pas la seule façon de fairerm
invoquer la commande externe. Comme indiqué dans le manuel, vous pouvez créer un alias pointantrm
vers*rm
(voir également emacs.stackexchange.com/a/880/10761 ).