Jika saya memulai emacs -Q
dan M-x eshell
menjalankan emacs 24.5.2 , maka jalankan:
$ which rm
eshell/rm is a compiled Lisp function in `em-unix.el'
Saya mendapatkan versi eshell. Tetapi jika saya C-h v eshell-prefer-lisp-functions
melihat nilainya nihil. Namun dokumentasi menyatakan:
Jika Anda lebih suka menggunakan perintah bawaan daripada perintah eksternal, atur fungsi eshell-prefer-lisp-t ke t.
Apakah ini bug? Saya pikir dokumen mungkin mundur jadi saya mencoba mengatur variabel t
, tetapi perilaku tetap sama, saya terus mendapatkan implementasi eshell daripada versi di / bin.
which
. Jika Anda melakukannyarm --version
, apa yang Anda dapatkan?$ *rm filename
. Memulai*
akan membuateshell
lompatan mencari perintah bawaan. Metode ini berguna untuk mem-bypass perintah bawaan, apa pun pengaturan yang diinginkan .Jawaban:
Eshell selalu lebih suka fungsi Lisp.
eshell-prefer-lisp-functions
hanya mempengaruhi interpretasi*rm
, bukan interpretasirm
.Sumber: kode sumber ... Dari Emacs 24.3:
eshell-find-alias-function
mencari fungsi di bawaheshell/
awalan. Ada logika serupa dieshell/which
.Dokumentasi variabel itu benar-benar menyesatkan, dan manualnya juga agak menyesatkan. Saya kira perilaku ini berdasarkan desain (setelah semua, mengapa Anda mendefinisikan fungsi eshell jika tidak menggunakannya?), Jadi ini adalah bug dokumentasi.
Untuk menjalankan utilitas eksternal, panggil
/bin/rm
, atau, asalkan Anda dibiarkaneshell-prefer-lisp-functions
tidak ada, panggil*rm*
. Jika Anda inginrm
selalu menjalankan utilitas eksternal, Anda dapat menetapkan alias:alias rm "rm $*"
(terima kasih GDP2 ).sumber
rm
selalu memohon perintah eksternal adalah untuk memastikan bahwa tidak ada fungsi yang disebuteshell/rm
. (Itu, atau tentu saja menasihati atau mendefinisikan ulang beberapa kode Eshell.)" Itu bukan satu-satunya cara untuk membuatrm
memohon perintah eksternal. Seperti yang didokumentasikan dalam manual, Anda dapat membuat alias yang menunjukrm
ke*rm
(lihat juga emacs.stackexchange.com/a/880/10761 ).