無論我們在windows下或者在linux下使用emacs,毫無疑問,我們都需要借助很多外部命令來完成相應的任務。
那麼,在emacs中,是通過什麼方式找到外部命令的呢?
我們都知道,無論在什麼系統下,將某個可執行檔案的目錄加入path環境變數,就可以在命令列下使用這個命令,無論這個命令放在**。
所以,emacs啟動時的path變數,是emacs中尋找外部命令的乙個因素。
除此之外,emacs中還有乙個主要的變數,那就是exec-path。
exec-path和path環境變數有什麼區別?
exec-path是用來幫助emacs尋找可以*直接*使用的外部程式。所謂直接,表明是作為乙個子程序存在的程式。這個子程序可以繼承path環境變數,從而讓子程序也可以找到對應的程式的執行路徑。舉個例子來說,如果你你指設定grep的執行路徑給exec-path,你會發現,m-x grep執行不正確。那是因為,grep是通過乙個sh子程序去執行的,所以,正確的辦法是,更新path環境變數。
究竟應該何時設定exec-path和path環境變數?
當然,除非你可以很明確的區分emacs啟動某些子程序的方式,否則,不必明顯的區分exec-path和path,我得建議是同時將兩者更新即可。
(defun wttr/prepend-to-exec-path (path)
"prepand the path to the emacs intenral `exec-path' and \"path\" env variable.
return the updated `exec-path'"
(setenv "path" (concat (expand-file-name path)
path-separator
(getenv "path")))
(setq exec-path
(cons (expand-file-name path)
exec-path)))
這裡提供乙個我使用的函式,可以比較方便的同時更新這兩個變數。使用舉例:
(mapc #'wttr/prepend-to-exec-path
(reverse
'("~/bin"
"~/.emacs.d/extra-bin/unix-utils-bin"
"~/.emacs.d/extra-bin/etc"
"~/.emacs.d/extra-bin/putty"
"~/.emacs.d/extra-bin/clang"
)))
為什麼不選擇將emacs使用的命令全加入系統的path?
就如同我上面的例子,emacs使用了很多linux下的命令,這些命令(例如:find)和windows系統的命令會有衝突。
如果全部加入系統path,可以會引起一些系統指令碼不能正常執行。所以,比較安全的方式是,只更新emacs內部的狀態,對外部不會有任何影響。
以上~
php 無法執行外部命令 如何呼叫外部命令
呼叫外部命令的函式有很多 system passthru escapeshellcmd pcntl exec exec 關於他們的使用我不過度闡述了 然而有時候會遇到這樣的情況 當我們在php指令碼中新增了這樣的命令 例 exec rm rf a b c html 的時候 始終不能執行 問題一 我碰...
Java中呼叫外部命令
public class exec mond 執行一條命令 param execstr string 命令字串 return string 執行命令錯誤時的資訊。public static string exec string execstr 執行linux下的命令 執行windows下的命令 st...
php呼叫外部命令(Linux下)
exec cp fpath.tpath,out,status 複製檔案,fpath為原檔案位址,tpath為要複製到的位置路徑,status為執行結果返回值。include conn to.php top sql select from uchome pic where 1 order by pic...